【问题标题】:Update data into table from dynamically created input field从动态创建的输入字段将数据更新到表中
【发布时间】:2017-11-16 08:27:56
【问题描述】:

我有 2 个模型 Tour.php

public function Itinerary()
{
    return $this->hasMany('App\Itinerary', 'tour_id');
}

Itinerary.php

public function tour() 
{
    return $this->belongsTo('App\Tour', 'tour_id');
}

游览表:

id|title|content

行程表:

id|tour_id|day|itinerary

我已经使用 vue js 来创建或添加和删除一天的输入字段并动态计划。并在tour.store 方法中使用以下代码插入到itineraries 表中:

    $count = count($request->input('day'));
$temp_day        = $request->input('day');
$temp_itinerary  =   $request->input('itinerary');

for($i = 0; $i < $count; ++$i) 
{

    $itinerary = new Itinerary;
    $itinerary->tour_id        =  $tour->id;
    $itinerary->plan      =   $temp_itinerary[$i];        
    $itinerary->day            =   $temp_day[$i];
    $itinerary->save();
}

并且成功插入记录。并且在tour.store 方法中应用了相同的代码。它没有更新行,而是将新行插入到表中。最好的解决方案是什么?

【问题讨论】:

    标签: php mysql laravel laravel-5.4


    【解决方案1】:

    要更新试试这个代码

    $itinerary = Itinerary::find($tour_id);
    $itinerary->plan = $temp_itinerary[$i];        
    $itinerary->day = $temp_day[$i];
    $itinerary->save();
    

    【讨论】:

    • 您的代码也在做同样的事情。添加新行而不是更新它。仅供参考,我在有和没有 for 循环的情况下使用了你的代码,结果是一样的。
    • $itinerary = Itinerary::find($tour_id); 行返回错误Creating default object from empty value。我在 for 循环开始之前分配了$tour_id = $tour-&gt;id;
    • 有什么方法可以使用构建器查询而不是 eloquent?
    • 用雄辩的方法不可能吗?
    • 不,不是不可能,我只是在问
    【解决方案2】:

    您使用的方式是插入/创建新记录。要更新您可以使用。

    Itinerary::find($tour_id)->update(
       ['column_name'=> value]
    );
    

    find 方法采用表的主键。

    这将更新您现有的记录。您可以根据需要更新任意数量的列,只需传入数组 update 即可。您也可以使用其他答案中提到的save 方法。

    查看Laravel Update Eloquent

    编辑

    $iterneary = Itenerary::where('tour_id', $tour_id)->first();
    

    现在您可以将此 iterneary 对象更新为您想要的任何内容。

    【讨论】:

    • 感谢您的建议。您的代码正在返回消息 Call to a member function update() on null。所以我尝试了 $test = Itinerary::find($tour_id); dd($test); where $tour_id = $tour-&gt;id; i.e tour_id =2; 输出是 null 。不知道怎么回事。
    • @TanjaForsberg,请检查上面的编辑并在进一步移动之前执行dd($iterneary)
    • 还是没有运气。代码仍在添加新行而不是更新记录。
    • 我正在运行这段代码$itinerary = Itinerary::where('tour_id', $tour_id); for($i = 0; $i &lt;$count; ++$i) { $itinerary-&gt;updateOrCreate([ 'tour_id' =&gt; $tour_id, 'plan' =&gt; $temp_itinerary[$i], 'day' =&gt; $temp_day[$i], ]); }
    【解决方案3】:

    我就是这样做的。首先将所有游览保存在 $tours[] 数组中。

    foreach($tours as $tour) {
            $itinerary->tour()->updateOrCreate(['id'=> $tour['id']],$tour);
        }
    

    updateOrCreate 因为您可能需要在更新时添加新的游览。我知道这并不能完全回答您的问题,但这至少可以给您一个想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-05
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      • 2021-01-26
      相关资源
      最近更新 更多