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

时间:2015-05-12 13:30:43

标签: php laravel laravel-5 eloquent has-and-belongs-to-many

我有一个项目,用户可以在其中与其他用户建立对话。对话可以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的数据

enter image description here

3 个答案:

答案 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_idconversation_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;