【问题标题】:Laravel update method not workingLaravel 更新方法不起作用
【发布时间】:2016-12-07 16:16:36
【问题描述】:

我正在尝试更新我的数据库,但它无法正常工作。

我构建了一个更新方法,问题是它不断更新所有带有 product_id 的记录,而它应该更新每条记录 例如,我的数据库中有 10 条具有不同值的记录。

如果我运行脚本,所有记录都会从输入字段中获取第一个值。

如何让它正常工作?

我的数据库的一点点,看起来像这样:

id      |       product_id       |       short_name      |      input_video
___________________________________________________________________________
 1      |            49          |            de         |       c:\...
 2      |            49          |            en         |       c:\...
 3      |            49          |            tr         |       c:\...
 4      |            49          |            dr         |       c:\...

如果我运行我的代码(选择 de),它看起来像这样:

id      |       product_id       |       short_name      |      input_video
___________________________________________________________________________
 1      |            49          |            de         |       c:\...
 2      |            49          |            de         |       c:\...
 3      |            49          |            de         |       c:\...
 4      |            49          |            de         |       c:\...

代码:

    # save language selection
    $lsCounter = 0;
    $langSelecName = $request->input('language_selection');
    $langSelecFile = $request->file('language_selection');
    if($langSelecName)
    {
        $projectLangPath = $Path . "language";

        foreach($langSelecName as $langSelecNameKey => $langSelecNameValue)
        {
            if($langSelecFile[$lsCounter]['input_vid_lang'] != null)
            {
                $langVidFileName = $langSelecFile[$lsCounter]['input_vid_lang']->getClientOriginalName();

                $languages = new Language();
                $languages['short_name']  = $langSelecNameValue;
                $languages['input_video'] = $projectLangPath . '\\' . $langVidFileName;

                $languages->product()->associate($product);

                $langSelecName = $request->input('language_selection');

                $langData = [
                    'short_name' => $languages['short_name'],
                    'input_video' => $languages['input_video']
                ];

                $intProductID = intval($productID);

                $findLang = $languages->where('product_id', $intProductID);

                $productID = $data['id'];

                if($findLang->update($langData))
                {
                    $langSelecFile[$lsCounter]['input_vid_lang']->move($projectLangPath, $langVidFileName);
                }
            }

            $lsCounter++;
        }
    }

我的 where 子句可能不正确,但我不知道如何解决它。

编辑 我的模特:

<?php

    class Language extends Model
    {

        protected $table = 'products_languages';

        protected $fillable = ['product_id', 'short_name', 'input_video'];

        public function product()
        {
            return $this->belongsTo('App\Product', 'product_id');
        }

    }

编辑

查看:

            <fieldset class="form-group">
                <select class="form-control" id="language_selection" name="language_selection[]" multiple>
                    @foreach($languages as $languageKey => $languageValue)
                        <option value="<?php echo $languageValue->short_name; ?>"><?php echo $languageValue->name; ?></option>
                    @endforeach
                </select>
            </fieldset>
            @if($type == "edit")
                <input name="id" type="hidden" value="{{ $productId }}">
                @if($languagesCount > 0)
                    @foreach($languages as $languagesKey => $languagesValue)
                        <?php $i = 0 ?>
                            <span class="btn btn-primary btn-file lang-edit">{{ strtoupper($languagesValue->short_name) }}</span>
                        <?php $i++ ?>
                    @endforeach
                @endif
            @endif

【问题讨论】:

  • 你能提供内容 $langSelecName 吗?还请添加您的语言模型/或类是什么?好像。为什么你将 short_name 和 input_video 作为关联数组约束而不使用对象运算符?
  • @Frank Provost 我得到这个输出数组:1 [▼ 0 => "de" ]
  • @FrankProvost 我添加了我的模型
  • 我很难理解你当前的代码。似乎您并没有真正使用 laravel 的所有功能。这使得阅读变得困难。也许您可以用简单的方式描述您在代码中真正想要实现的目标。你的前端是什么样子的?如果输入数据只包含一个值,为什么需要循环遍历它。
  • @FrankProvost 我针对该特定问题添加了我的观点

标签: php sql laravel foreign-keys where


【解决方案1】:

这里的顺序好像有点乱:

        $intProductID = intval($productID);

        $findLang = $languages->where('product_id', $intProductID);

        $productID = $data['id'];

你可能打算这样做:

        $productID = $data['id'];

        $intProductID = intval($productID);

        $findLang = $languages->where('product_id', $intProductID);

等同于:

        $findLang = $languages->where('product_id', intval($data['id']));

因为我没有看到你在其他任何地方使用这些 ID。

【讨论】:

  • 您正在更新 product_id = 49 的数据库行,因此您正在更新所有行...这可能不是您想要的。
  • 如果可能,请使用“id”字段而不是“productId”
【解决方案2】:

我重新格式化、重命名和返工了很多。我的假设在最顶部的 cmets 中定义

// $product_id = 1 
// $lang_select_name = ["TR"] => on create it was ["DE", "EN"] and is now updated with TR only
// $lang_select_file = [<fileTR>] => on create it was [<fileDE>,<fileEN>]
// $projectLangPath = '' // whatever your path is

// first of all get the product 
$product = Product::find($product_id);

// list all existing short_names for product id
$existing = $product->languages->lists('short_name');

// tbd: delete every entry that is existing but not in $lang_select_name

// loop through given input of names 
for($i = 0; $i < count($lang_select_name); $i++) 
{
    // check that file is not null => should be done in validation if required
    if($lang_select_file[$i]['input_vid_lang'] != null)
    {
        // get the filename
        $vid_name = $lang_select_file[$i]['input_vid_lang']->getClientOriginalName();

        // first check if the language entry exists already
        $lang = Language::where('product_id', '=', $product_id)->where('short_name', '=', $lang_select_name[$i])->first();

        if(!$lang) {
            // create it 
            $lang = Product->languages()->create([
                "product_id" => $product_id,
                "short_name" => $lang_select_name[$i],
                "input_video" => $projectLangPath . '/' . $vid_name
            ]);
        } else {
            // update
            $lang->input_video = $projectLangPath . '/' . $vid_name;
            $lang->save();
        }
        // move the file
        $lang_select_file[$i]['input_vid_lang']->move($projectLangPath, $vid_name);
    }
}

基本步骤是:

  • 获取具有给定产品 ID 的产品
  • 获取给定产品的所有现有语言
  • 将语言(简称)的输入与获取的语言进行比较
  • 待定:删除输入中未提供的所有语言
  • 循环输入的短名称
    • foreach 短名称获取给定 product_id 的匹配语言
    • 如果找不到就创建一个,否则更新现有的
  • 移动文件(也可以检查是否没有任何变化 - 然后不要重新创建)

【讨论】:

    猜你喜欢
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    相关资源
    最近更新 更多