验证belongsToMany以获取控制器laravel 5.4

时间:2017-05-13 13:51:22

标签: laravel eloquent laravel-5.4 laravel-eloquent

我正在用一些电影信息创建这种数据库。

逻辑结构非常简单一部电影有很多演员,一部演员制作了很多电影所以这是多对多关系。

我也正在使用select2库来编写一个简单的输入,其中写入标记符号,用逗号或空格键(here the link to docs)分隔,并在简单快照下方以更好地理解结果

graphical representation

在创建/存储功能中,我不需要检查是否存在任何关系,因为它是新的电影。所以我只需要检查数据库中是否已存在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);
    }
  }
}

感谢您的帮助。

2 个答案:

答案 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);
    }
  }

}