【问题标题】:Laravel: find if a pivot table record existsLaravel:查找数据透视表记录是否存在
【发布时间】:2016-05-19 01:48:28
【问题描述】:

我有两个模型,它们通过数据透视表连接,UserTask

我有一个user_id 和一个task_id

检查这种用户和任务组合是否存在记录的最简洁方法是什么?

【问题讨论】:

标签: php laravel eloquent pivot-table


【解决方案1】:

根据您的情况,您有几个选择。

如果您已经有一个User 实例,并且您想查看它是否有具有特定id 的任务,您可以这样做:

$user = User::find(1);
$hasTask = $user->tasks()->where('id', $taskId)->exists();

如果您有 Task 实例并想要检查用户,则可以撤消此操作:

$task = Task::find(1);
$hasUser = $task->users()->where('id', $userId)->exists();

如果您只有 id,没有每个的实例,您可以执行以下操作:

$hasPivot = User::where('id', $userId)->whereHas('tasks', function ($q) use ($taskId) {
        $q->where('id', $taskId);
    })
    ->exists();

【讨论】:

【解决方案2】:

你也可以试试这个,这在 Laravel 5.7 中工作

$user = User::find(1);
$hasTask = $user->tasks->contains($taskId);

但更好的方法是

$hasTask = $user->tasks()->where('tasks.id', $taskId)->exists();

【讨论】:

  • 避免这样做 - 这会检索某个用户的所有任务,将它们放入内存中,然后检查 $taskId 是否在其中。
  • @Eduardo 是的,人们应该更喜欢急切加载或关系查询而不是收集来检查这一点。
  • @Eduardo 我已经更新了我的答案,我认为这样会更好。
【解决方案3】:

你会搜索这个吗?

$users = User::has('task')->get();

【讨论】:

    【解决方案4】:

    对我来说最容易阅读的是:

    $user->tasks()->exists();
    

    【讨论】:

      【解决方案5】:

      您可以使用下面的代码:

      $user = User::find(1);
      
      $hasTask = $user->tasks()->where('task_id', $taskId)->exists();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-19
        • 1970-01-01
        • 2019-03-20
        • 1970-01-01
        • 1970-01-01
        • 2015-01-21
        相关资源
        最近更新 更多