我在Laravel 4.2中有Eloquent声明,看起来像这样
$user_message_block = Message::where('responder_id', '=', Auth::user()->id)
->where('user_id', '=', $user->id)->first();
然后,如果$user_message_block
不存在,我还必须检查反向情况,我这样做......
if(!$user_message_block){
$user_message_block = Message::where('responder_id', '=', Auth::user()->id)
->where('user_id', '=', $user->id)->first();
}
我真正想做的是运行一次查询,一次检查两个场景。
在伪表达式中我需要这样的东西:
$user_message_block = Message::where('responder_id', '=', Auth::user()->id,
'AND', 'user_id', '=', $user->id,
'OR', 'responder_id', '=', $user->id,
'AND', 'user_id', '=', Auth::user()->id)->first();
基本上我需要
SELECT Message where (responder_id=x AND user_id=y) OR where (responder_id=y AND user_id=x)
我怎么能用Eloquent做到这一点。我无法找到有关Eloquent使用的OR和AND语句的更多信息。
谢谢!
更新:
经过更多的研究后,我发现这似乎有效(仍在测试中)
$user_message_block =
Message::where(['responder_id' => Auth::user()->id, 'user_id' => $user->id])
->orWhere(['user_id' => Auth::user()->id, 'responder_id' => $user->id])
->first();
OR
$user_message_block =
Message::where(['responder_id' => Auth::user()->id, 'user_id' => $user->id])
->orWhere(['user_id' => Auth::user()->id, 'responder_id' => $user->id])
->get();
我需要考虑这个缺点吗?
答案 0 :(得分:4)
在Eloquent中执行它可能非常复杂,但这完全符合您使用Laravel的查询构建器所需而无需还原为原始SQL。
DB::table('messages')
->where(function($query)
{
$query->where('responder_id', '=', 'x')
->where('user_id', '=', 'y');
})
->orWhere(function($query) {
$query->where('responder_id', '=', 'y')
->where('user_id', '=', 'x');
})
->get();
这是我在其上运行toSql()
所获得的:
select * from `messages` where (`responder_id` = ? and `user_id` = ?) or (`responder_id` = ? and `user_id` = ?)
试试看它是否适用于Eloquent。
Message::where(function($query) {
$query->where('responder_id', '=', 'x')
->where('user_id', '=', 'y');
})->orWhere(function($query) {
$query->where('responder_id', '=', 'y')
->where('user_id', '=', 'x');
})->get();
它应该有用。
答案 1 :(得分:0)
由于提供了一个有效的解决方案以及他帮助我做出的努力,我将诺亚归功于解决方案。我最终使用了不同的解决方案..
$user_message_block =
Message::where(['responder_id' => 'x', 'user_id' => 'y'])
->orWhere(['user_id' => 'x', 'responder_id' => 'y'])
->get();
在我的特定情况下,我只需要找到第一条记录,这对我有用
$user_message_block =
Message::where(['responder_id' => 'x', 'user_id' => 'y'])
->orWhere(['user_id' => 'x', 'responder_id' => 'y'])
->first();
我只想说,我在Alex的phpacademy视频中找到了类似于我的解决方案。我也偶然发现了Laravel eloquent SQL query with OR and AND with where clause