Laravel Query Builder或者返回false结果

时间:2015-08-16 22:27:45

标签: php laravel query-builder laravel-5.1

我需要一个查询来计算尚未看到的对话。 它工作正常,但当我还想检查是否与from_id进行任何对话时,它会返回错误的结果。

Conversation::where('to_id', $this->id)->whereExists(function($query) {
    $query->select(DB::raw(1))
        ->from('messages')
        ->where('seen', 0)
        ->whereRaw('messages.conversation_id = conversations.id');
})->count();

结果:0

Conversation::where('from_id', $this->id)->whereExists(function($query) {
    $query->select(DB::raw(1))
        ->from('messages')
        ->where('seen', 0)
        ->whereRaw('messages.conversation_id = conversations.id');
})->count();

结果:0

Conversation::where('to_id', $this->id)->orWhere('from_id', $this->id)->whereExists(function($query) {
    $query->select(DB::raw(1))
        ->from('messages')
        ->where('seen', 0)
        ->whereRaw('messages.conversation_id = conversations.id');
})->count();

结果1

所以我可以运行它们并添加结果,但必须有更好的解决方案。

更新 我忘记了orWhere陈述的逻辑部分。 当左侧部分为真或右侧部分时,查询为真。因此,当to_id等于id时,整个查询都为真。

我通过将or语句放在函数中来解决它:

Conversation::where(function($query) {
    $query->where('to_id', $this->id)
        ->orWhere('from_id', $this->id);
})->whereExists(function($query) {
    $query->select(DB::raw(1))
        ->from('messages')
        ->where('seen', 0)
        ->whereRaw('messages.conversation_id = conversations.id');
})->count();

0 个答案:

没有答案