我的问题
我正在构建一个社交网络,我想选择一个" Feed项目列表"从表(feed_items
)。根据{{1}}列中的指定,Feed项可以是status-update
,kiss
或photo
。
如果您是某人的朋友,则可以按照type
列的标识查看他们发布的status-update
或photo
个帖子。
您只能看到发送给您的吻,即代表user_id
的列。
我的代码
我想使用Eloquent,因为我可以使用它来获取每个Feed项的关系。以下是我的查询代码:
specific_user_id
当我在Laravel中运行代码时,它只返回kisses。但是,如果我从查询日志中复制查询:
$items = FeedItems::where(function($query) use($connectionsString)
{
$query->whereRaw("(type = ? and specific_user_id = ?)",
[
"kiss",
Sentry::getUser()->id
])
->orWhere(function($query) use($connectionsString)
{
$query->whereRaw("(user_id in (?) and type != ?)",
[
"$connectionsString",
"kiss"
]);
}
);
})
->whereNotIn("id", $hidden)
->with("user", "status", "photo")
->paginate(90);
并将其调整为在Sequel Pro中运行:
{
"query": "select * from `feed_items` where ((type = ? and specific_user_id = ?) or ((user_id in (?) and type != ?))) and `id` not in (?) limit 90 offset 0",
"bindings": [
"kiss",
"1",
"354, 226, 391, 628, 411, 748, 678, 367, 739, 141, 129, 717, 586, 441, 657, 532, 444, 649, 648, 630, 132, 273, 477, 675, 69, 504, 621, 729, 606, 742, 124, 357, 168, 394, 115, 436, 748, 547, 628, 99, 202, 321, 243, 370, 130, 73, 535, 199, 471, 547, 736, 480, 715, 556, 697, 501, 118, 195, 220, 480, 24, 471, 348, 7, 625, 261, 220, 30, 357, 592, 435, 667, 439, 589, 198, 91, 565, 121, 210, 16, 465, 93, 628, 246, 709",
"kiss",
0
],
}
我可以随心所欲地获得亲吻,状态更新和照片。
有人能说清楚为什么会这样,也许可以为我的问题提供另一种解决方案吗?
答案 0 :(得分:2)
询问你是否正在使用Laravel运行,而你在SequelPro中运行的那个是不同的,尽管乍一看几乎没有什么区别。
这就是你所需要的,绝对不要使用那些嵌套的whereRaw
,因为它没有意义,也从不将绑定字符串传递给where in
(见下文) :
$connectionsArray; // array of user_id s
$userId = Sentry::getUser()->id;
$items = FeedItems::where(function($q) use ($connectionsArray, $userId)
{
$q->where('type', 'kiss')
->where('specific_user_id', $userId)
->orWhereIn('user_id', $connectionsArray)
->where('type', '<>', 'kiss');
})
->whereNotIn("id", $hidden)
->with("user", "status", "photo")
->paginate(90);
关于这种差异:
// SQL query:
SELECT ... WHERE ... OR user_id in (354, 226, ...) ...
// Laravel query:
SELECT ... WHERE ... OR user_id in ('354, 226, ...') ...
也就是说,你的联合ID被PDO绑定并被视为字符串,因此评估为1。
你可以这样做,这个可以按预期工作:
whereRaw("user_id in ({$connectionsString})")
但我不愿意。