Laravel Eloquent: 获取包含两个特定关系的记录

Laravel Eloquent: Get record that contains two specific relations

我有一个项目,用户可以在其中创建与其他用户的对话。一个对话可以 belongsToMany 个用户,用户可以 belongsToMany 个对话。

我现在需要获取两个特定用户参与的对话。

我尝试了使用 whereIn 的解决方案组合,并尝试了以下方法:

$c = Conversation::whereHas('users', function($q)
     {
         $q->whereIn('user_id', array(1,3));
     })
    ->get();

这里的问题是 whereIn('user_id', [1,3]) 获取包含 EITHER 1 或 3 的记录。我需要它 return 包含 [=46= 的记录]两者 1 和 3.

对话模型

class Conversation extends Model {

    public function users(){
        return $this->belongsToMany('App\User');
    }
}

用户模型

class User extends Model {

    public function conversations(){
        return $this->belongsToMany('App\Conversation');
    }

}

表格

对话:

编号 |主题

conversation_user:

编号 | user_id | conversation_id

数据来自tableconversation_user

希望对您有所帮助...

    $userIds = array(1,3);
    $c = Conversation::whereHas('users', function($q) use ($userIds)
         {
             $q->whereIn('user_id', $userIds);
         })
        ->get();

您目前正在查询用户 1 和/ 3 参与的对话。要实现您想要的结果,您需要两次 whereHas 调用:

$c = Conversation::whereHas('users', function($q)
     {
         $q->where('user_id', 1);
     })
     ->whereHas('users', function($q)
     {
         $q->where('user_id', 3);
     }
     ->get();

如果您有两个以上的用户,请循环添加他们:

$users = [1, 2, 3, 4, 5];
$c = Conversation::query();
foreach($users as $userId){
    $c->whereHas('users', function($q) use ($userId)
    {
        $q->where('user_id', $userId);
    });
}
$c = $c->get();

您的最新编辑更有意义,这实际上是一个非常容易解决的问题。 whereHas 使用两个附加参数来查找计数。

$users = [1, 3];   

$c = Conversation::whereHas('users', function($q) use ($users)
{
    $q->whereIn('user_id', $users);
}, '>', count($users) )
->get();

这将获取用户 1 和 3 参与的所有对话,即使有其他用户参与了这些对话。如果您只想与用户 1 和 3 进行对话,请将 > 更改为 =

编辑:我刚刚发现您的数据透视表 table 有一个 id 列。如果您的数据透视表 table 将有重复项,则此方法可能无效。例如,如果你有两次 user_id 的 1,两次都是相同的 conversation_id,即使它在技术上只有 1 个用户,它也会 return 该对话。我建议删除 id 列并创建 user_idconversation_id 的复合主键。如果有重复的可能性,使用lukasgeiter的解决方案可能更安全。