Laravel更新一对多关系

时间:2018-08-26 18:45:00

标签: php laravel dingo-api

我有一个包含下一个数据的请求

{
  "path": "some path",
  "site_link": "http://example.com"  
  "features": [ ... ] //array of strings
}

我希望更新两个表sitesite features

site表包含| id | path | site_link |

还有site features的{​​{1}} 我不知道确切的“功能”数量,但是我需要在请求后对其进行更新。

有什么方法可以进行更新以删除它们,然后再次创建。 (某些功能可能会更改,某些功能会删除并添加)。

目前,我没有任何用于更新功能的代码。只有这个

| id | feature | site_id |

2 个答案:

答案 0 :(得分:0)

好吧,根据您的情况,您无法更新site_features这样的行。因为您需要在site_features表中第二个标识符。下面的查询仅一次又一次更新第一列。因此,使用create方法保存这些功能create新行的唯一方法。

如果要更新特定的site_features列,则必须将这些功能的ID传递给控制器​​

public function update(Request $request, Site $site)
    {
       // first you need to select a row before updating it
        $site = $site->where("site_link",$request->site_link)->first(); 
        $site->update([
            "path" => $request->path,
           ]);

        foreach($request->features as $feature){
            SiteFeature::where("id",$feature->id)
             ->update([
                "feature" => $feature->content
             ]);
          }

        return response()->json($site, 200);
    }

如果您还没有id参数,那么,如果这些是新功能,那么您必须为其创建新记录

public function update(Request $request, Site $site)
    {
        $site = $site->where("site_link",$request->site_link)->first(); 
        $site->update([
            "path" => $request->path,
           ]);

        foreach($request->features as $feature){
            SiteFeature::create([
                "feature" => $feature
             ]);
          }

        return response()->json($site, 200);
    }

还有第三种方法。如果您的功能有限。例如,关于这些网站只有80个功能。有些网站具有某些功能,而其他网站则没有。.那么您可能想要使用many to many关系。创建功能表并添加所有功能,并使功能与站点之间的关系多对多。之后,您只需要同步这些功能。它很容易使用。以及当您需要对功能之一进行一些更改时。您无需做大量更改。只需在功能表上更改此功能,即可影响所有网站。

我希望你能理解我,因为我的英语太糟糕了:)

答案 1 :(得分:0)

首先,希望您已经为站点功能表创建了一个模型。很简单 现在

$updates =  SiteFeatures :: where ('feature',$feature)->where('site_id',$siteID) ->get();

更新:-

$updates->feature = $newFeature;
$updates->save();

删除:-

$updates->delete();

对于新功能的添加,您不需要第一条陈述 代替

$newFeature = new SiteFeatures();
$newFeature->feature = 'the new feature';
$newFeature->site_id = the_site_id;
$newFeature->save();