我想检查两个用户是否具有相同的关系。我有模型:User
和Team
.
用户关系:
public function teams()
{
return $this->belongsToMany('App'Team');
}
团队关系:
public function users()
{
return $this->belongsToMany('App'User');
}
因此,用户可以成为少数团队的一部分。如何检查2个指定用户是否有共同团队?
假设您将模型视为 Eloquent Collections,则有几种方法可用于实现此目的。
一种选择是intersect
(更多在这里:https://laravel.com/docs/5.2/collections#method-intersect)
$user = User::with('teams') -> find($id);
$userCompare = User::with('teams') -> find($idCompare);
dump( $user -> teams -> intersect($userCompare -> teams) -> count() );
在嵌套循环中按名称检查怎么样,如下所示:
$user1 = User::find(1);
$user2 = User::find(2);
foreach($user1->teams->name as $team1)
foreach($user2->teams->name as $team2)
if($team1 == $team2)
//do awesome stuff
以上是行不通的。正确的代码是(如Filip Koblański所建议的那样):
$user1 = User::find(1);
$user2 = User::find(2);
foreach($user1->teams as $team1)
foreach($user2->teams as $team2)
if($team1->name == $team2->name)
//do awesome stuff
我不能帮助你雄辩,但我可以帮助你进行原始查询。考虑到您的表称为用户和team_memberships(存储成员资格的多对多表),您可以执行这样的原始查询。
function checkCommonTeams($user_id_A, $user_id_B){
$common = DB::select(
DB::raw(
'SELECT users.*,teams.* FROM users as user_A
INNER JOIN team_memberships as teams ON user_A.id = teams.member_id
INNER JOIN team_memberships as teams_B ON teams_B.id = teams.id
WHERE teams_B.member_id = :user_B AND users.id = :user_A LIMIT 1'
),
['user_A' => $user_id_A, 'user_B' => $user_id_B]
);
return (!count($common)) ? false : true;
}
像这样的东西应该比查询两个用户的团队并检查每个值等更快地工作和执行。您只需要自己检查数据库的结构即可。
如果他们共享团队,这将返回 true 或 false。
我的理念是,如果你可以在数据库中做这样的事情,那么试着去做,因为它几乎总是能够比多查询和比较 php 中的值做得更好。