验证控制器中更新功能的 belongsToMany laravel 5.4
Verify belongsToMany for update function in controller laravel 5.4
我正在用一些电影信息创建这种数据库。
逻辑结构很简单一部电影有很多演员,一个演员拍了很多电影所以这是一个多对多的关系。
我也在使用 select2
库来获得一个简单的输入,在其中编写像标签一样的演员,用逗号或空格键 (here the link to docs) 将它们分隔开,并在简单的快照下方更好地理解结果
在 create/store 函数中,我不需要检查是否存在任何关系,因为电影是新的。所以我只需要检查数据库中是否已经存在演员,如果不存在就保存他们。
我的控制器 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);
}
}
}
感谢您的帮助。
使用 eloquent 没有直接的方法来做到这一点。但是你可以像这样使用 using 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(); }
所以现在,与至少一部电影相关的演员将不会被删除。
好的,我找到了我的路。第一部分检查是否有新演员,如果为真,它会在演员 table 中创建一个新行。对于第二部分,检查输入是否有变化,比较新数组与数据库中保存的关系,因此它可以检测是否删除了一些演员,然后也删除了关系。
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);
}
}
}
我正在用一些电影信息创建这种数据库。
逻辑结构很简单一部电影有很多演员,一个演员拍了很多电影所以这是一个多对多的关系。
我也在使用 select2
库来获得一个简单的输入,在其中编写像标签一样的演员,用逗号或空格键 (here the link to docs) 将它们分隔开,并在简单的快照下方更好地理解结果
在 create/store 函数中,我不需要检查是否存在任何关系,因为电影是新的。所以我只需要检查数据库中是否已经存在演员,如果不存在就保存他们。
我的控制器 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);
}
}
}
感谢您的帮助。
使用 eloquent 没有直接的方法来做到这一点。但是你可以像这样使用 using 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(); }
所以现在,与至少一部电影相关的演员将不会被删除。
好的,我找到了我的路。第一部分检查是否有新演员,如果为真,它会在演员 table 中创建一个新行。对于第二部分,检查输入是否有变化,比较新数组与数据库中保存的关系,因此它可以检测是否删除了一些演员,然后也删除了关系。
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);
}
}
}