验证控制器中更新功能的 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);
    }
  }

}