我的查询在Laravel中无法正常工作,但在Sequel Pro中可以正常使用

时间:2014-11-26 16:07:50

标签: mysql laravel eloquent

我的问题

我正在构建一个社交网络,我想选择一个" Feed项目列表"从表(feed_items)。根据{{​​1}}列中的指定,Feed项可以是status-updatekissphoto

如果您是某人的朋友,则可以按照type列的标识查看他们发布的status-updatephoto个帖子。

您只能看到发送给您的吻,即代表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
    ],
}

我可以随心所欲地获得亲吻,状态更新和照片。 Query code run in Sequel Pro

有人能说清楚为什么会这样,也许可以为我的问题提供另一种解决方案吗?

1 个答案:

答案 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})")

但我不愿意。