Laravel Eloquent 在连接中使用 WHERE 而不是 AND

Posted

技术标签:

【中文标题】Laravel Eloquent 在连接中使用 WHERE 而不是 AND【英文标题】:Laravel Eloquent using WHERE instead of AND in Joins 【发布时间】:2015-04-23 18:43:33 【问题描述】:

我有以下疑问:

select i.name,i.id itemId,its.item_id from items i
LEFT JOIN items_subscribers its
ON i.id = its.item_id
and its.user_id = 1

我变成了这样的雄辩方式:

$records = Item::where('items_subscribers.user_id',$user_id)
            ->leftJoin('items_subscribers','items.id','=','items_subscribers.item_id')
            ->select(['items.name','items.id','items_subscribers.item_id as selected_item_id'])->get();

当我运行 print_r(DB::getQueryLog()); 时,它会打印以下查询:

select `items`.`name`, `items`.`id`, `items_subscribers`.`item_id` as `selected_item_id` from `items` left join `items_subscribers` on `items`.`id` = `items_subscribers`.`item_id` where `items_subscribers`.`user_id` = ?

查询没有产生任何结果。我想使用 AND 而不是 WHERE。我是怎么做到的?

我正在使用 Laravel 4.2

【问题讨论】:

【参考方案1】:

只需在leftJoin 部分添加另一个on 方法,而不是使用where 方法。 - https://***.com/a/26714765/3208719

【讨论】:

现在这样做会出现此错误Database [items_subscribers.user_id] not configured.【参考方案2】:

尝试使用闭包并在其中添加条件:

$records = Item::leftJoin('item_subscribers', function($join) use ($user_id)
        $join->on('items.id','=','items_subscribers.item_id');
        $join->where('items_subscribers.user_id', '=', $user_id);
    )
    ->select(['items.name','items.id','items_subscribers.item_id as selected_item_id'])
    ->get();

【讨论】:

完美。只是想知道为什么andWhere 不能工作而且必须调用闭包? 好吧,连接闭包内部的where() 与外部的where() 不同。 "join-where" 将添加一个额外的on 子句,但对值使用绑定。如果您使用on() 两次,它将搜索名为1 的列($user_id)。希望解释有所帮助;) 一个奇怪的问题。我无法访问 JOINed 表 items_subscribers 的列。此处显示的输出:pastebin.com/i4mk7P0z 你是如何访问它们的? 我只是print_r($records)selected_item_id 的列是空的

以上是关于Laravel Eloquent 在连接中使用 WHERE 而不是 AND的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel Eloquent 中使用“with()”函数连接列

使用 eloquent laravel 获取连接表数据

Laravel Eloquent 在连接中使用 WHERE 而不是 AND

在 Laravel eloquent 中应用左连接。

Laravel - Eloquent 连接

在 Laravel Eloquent 中连接表值