我有一个项目,用户可以在其中与其他用户创建对话。对话可以 belongsToMany
用户和用户可以belongsToMany
对话。
我现在需要获得两个特定用户参与的对话。
我尝试了使用 whereIn
的解决方案组合我尝试了以下方法:
$c = Conversation::whereHas('users', function($q)
{
$q->whereIn('user_id', array(1,3));
})
->get();
这里的问题是
whereIn('user_id', [1,3])
获取包含 1 或 3 的记录。我需要它返回包含 1 和 3 的记录。session 模型
class Conversation extends Model {
public function users(){
return $this->belongsToMany('App\User');
}
}
用户模型
class User extends Model {
public function conversations(){
return $this->belongsToMany('App\Conversation');
}
}
表
对话:
身份证 |主题
对话用户:
身份证 |用户 ID |对话_id
来自表conversation_user的数据
最佳答案
你最新的编辑更有意义,这实际上是一个非常简单的修复。 whereHas
需要两个额外的参数来查找计数。
$users = [1, 3];
$c = Conversation::whereHas('users', function($q) use ($users)
{
$q->whereIn('user_id', $users);
}, '>', count($users) )
->get();
这将获得用户 1 和 3 参与的所有对话,即使还有其他用户参与了这些对话。如果您只想与用户 1 和 3 进行对话,请更改
>
到 =
.编辑:我刚刚意识到你的数据透视表有一个
id
柱子。如果您的数据透视表将有重复项,则此方法可能不起作用。例如,如果您两次使用相同的 session_id 两次 user_id 为 1,即使它在技术上只有 1 个用户,它也会返回该 session 。我建议删除 id
列并创建复合主键 user_id
和 conversation_id
.如果存在重复的可能性,使用 lukasgeiter 的解决方案可能更安全。
关于php - Laravel Eloquent : Get record that contains two specific relations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30192408/