我正在用一些电影信息创建这种数据库。
逻辑结构非常简单一部电影有很多演员,一部演员制作了很多电影所以这是多对多关系。
我也正在使用select2
库来编写一个简单的输入,其中写入标记符号,用逗号或空格键(here the link to docs)分隔,并在简单快照下方以更好地理解结果
在创建/存储功能中,我不需要检查是否存在任何关系,因为它是新的电影。所以我只需要检查数据库中是否已存在actor,如果没有保存它们。
我的控制器store()
功能如下:
foreach ($request->input('actors') as $key => $new_actor) {
// if actors doesn't exist in the db it save it.
$check = Actor::where('name', '=', $new_actor)->count();
if ($check === 0) {
$actor = new Actor;
$actor->name = $new_actor;
$actor->save();
}
// Here it creates the relationship
$actor = Actor::where('name', '=', $new_actor)->first();
$film->actors()->attach($actor->id);
}
问题
当我编辑更改演员的电影时,例如删除或添加新演员。我需要检查控制器是否有新的关系,或者我是否必须删除一些。我该怎么办?
这是我的控制器update()
功能,当然根本不起作用
foreach ($request->input('actors') as $key => $new_actor) {
// if actors doesn't exist in the db it save it.
$check = Actor::where('name', '=', $new_actor)->count();
if ($check === 0) {
$actor = new Actor;
$actor->name = $new_actor;
$actor->save();
}
$actors = $film->actors()->get();
foreach ($actors as $key => $actor) {
if ($actor->name === $new_actor) {
$actor = Actor::where('name', '=', $new_actor)->first();
$film->actors()->attach($actor->id);
}
}
}
感谢您的帮助。
答案 0 :(得分:1)
使用雄辩的方法没有直接的方法来做到这一点。但你可以像这样使用db facade吗
$actors_film_relation = \DB::table('actor_film')->pluck('actor_id')->unique();
现在使用此功能,您可以获得至少附有一部电影的演员名单。
在删除用户之前,您可以检查actor_id是否不在$ actor_film_relation列表中,如下所示
if( !in_array( $id, $actors_film_realtion)) { $actor->delete(); }
现在,与至少一部电影相关的演员将不会被删除。
答案 1 :(得分:0)
好的,我找到了自己的方式。第一部分检查是否有新的actor,如果为true,则在actors表中创建一个新行。在第二部分中,检查输入中是否存在更改,将新数组与db中保存的关系进行比较,以便检测是否删除了某些actor,然后删除了该关系。
foreach ($request->input('actors') as $key => $new_actor) {
// if actors doesn't exist in the db it save it.
$check = Actor::where('name', '=', $new_actor)->count();
if ($check === 0) {
$actor = new Actor;
$actor->name = $new_actor;
$actor->save();
}
// If the relation doesn't exists it creates it.
if (!$film->hasActor($new_actor)) {
$actor = Actor::where('name', '=', $new_actor)->first();
$film->actors()->attach($actor->id);
}
// If the relation has been deleted, it deletes it.
$actors = $film->actors()->get();
$new_actors = $request->input('actors');
foreach ($actors as $key => $actor) {
$check = in_array($actor->name, $new_actors);
if ($check === false) {
$film->actors()->detach($actor->id);
}
}
}