【问题标题】:Laravel Eloquent JOIN WHERE id is nullLaravel Eloquent JOIN WHERE id 为空
【发布时间】:2016-04-27 09:52:25
【问题描述】:

我无法弄清楚如何在 eloquent 中执行相当于 join 语句的操作。

基本上从下面的代码我想要一个如下查询:

SELECT * 
FROM Vehicle v
JOIN VehicleImage i ON v.id = i.vehicle_id
limit 24

这是我目前使用的查询:

$cars = Vehicle::with(['images' => function($q){
    $q->orderBy('order');
}])->take(24)->get();

目前它带回所有车辆,无论它们是否有图像 - 所以我猜是左连接。我不想要这个,我只想要有 1 个或更多图像的行。这可能吗?

  class Vehicle extends Eloquent
    {

        public function images()
        {

            return $this->hasMany('App\Domain\Vehicles\VehicleImage');

        }
    }

    class VehicleImage extends Eloquent {

        public function vehicle()
        {
            return $this->belongsTo('App\Domain\Vehicles\Vehicle');
        }

    }

【问题讨论】:

  • with 不加入。它是急切的加载,它使用 2 个查询。第二个是IN

标签: laravel eloquent


【解决方案1】:

它不加入 with。它是急切加载,它使用 2 个查询。第二个是IN

因此,如果您不想使用 JOIN 等效项,请使用查询生成器。

Vehicle::leftJoin('...')->get();

https://laravel.com/docs/5.2/queries

另外,如果你想监控你的查询,安装这个包:

https://github.com/barryvdh/laravel-debugbar

【讨论】:

  • 谢谢。这是否意味着仅使用雄辩的模型无法实现我想要做的事情?这意味着我可以使用一个模型(车辆)进行连接,但不能同时使用两者?
  • 为什么?这仅意味着您可以使用 ORM-way 或 Query Builder Way。但是 ORM 不会使用 JOIN。您也可以以任何方式混合和匹配它们,因为它们是兼容的。
  • 我觉得应该是inner join 答案是:Vehicle::join('...')->get();
猜你喜欢
  • 2014-06-13
  • 2014-08-19
  • 1970-01-01
  • 2015-05-01
  • 2014-11-17
  • 2014-08-14
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多