拉拉维尔更新一对多关系



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

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

我想更新我的两个表格sitesite features

site表包含| id | path | site_link |

site features这些| id | feature | site_id |我不知道确切的"功能"数量,但是我需要在请求后更新它们。

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

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

public function update(Request $request, Site $site)
{
$site->update([
"path" => $request->path,
"site_link" => $request->link
]);
return response()->json($site, 200);
}

好吧,在您的情况下,您无法更新site_features行之类的内容。因为您需要在site_features表中使用第二个标识符。下面的查询一次又一次地只更新第一列。因此,使用创建方法将这些功能保存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关系。创建要素表并添加所有要素,并对要素和网站之间的关系进行多对多。之后,您只需要同步这些功能。它非常易于使用。以及当您需要对其中一个功能进行一些更改时。你不必做大规模更改。只需在功能表上更改此功能,即可影响所有网站。

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

首先,希望您已经为站点功能表创建了一个模型。这很容易。 现在在此之后

$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();

最新更新