我有一个项目,用户可以在其中与其他用户建立对话。对话可以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的记录。我需要它来返回包含 BOTH 1和3的记录。 / p>
会话模型
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 |受试者
conversation_user:
id | user_id | conversation_id
来自table conversation_user的数据
答案 0 :(得分:2)
您的最新编辑更有意义,这实际上是一个非常简单的修复。 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
列。如果数据透视表将具有重复项,则此方法可能无效。例如,如果两次使用相同的conversation_id两次,其中user_id为1,则即使技术上只有1个用户,也会返回该对话。我建议删除id
列并创建user_id
和conversation_id
的复合主键。如果有可能重复,使用lukasgeiter解决方案可能更安全。
答案 1 :(得分:1)
您目前正在查询用户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();
答案 2 :(得分:0)
我希望这会对你有帮助......
IF(name == @name) THEN
-- update
ElSE
-insert query
END IF;