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_id
和 conversation_id
的复合主键。如果有重复的可能性,使用lukasgeiter的解决方案可能更安全。
我有一个项目,用户可以在其中创建与其他用户的对话。一个对话可以 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_id
和 conversation_id
的复合主键。如果有重复的可能性,使用lukasgeiter的解决方案可能更安全。