我需要一个查询来计算尚未看到的对话。
它工作正常,但当我还想检查是否与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();