Eloquent where子句在使用with()-laravel 4时使用相关模型的列

时间:2014-08-22 07:26:20

标签: mysql sql laravel laravel-4 eloquent

我有2个模特

卡车

class Truck extends \Eloquent {
    // Add your validation rules here
    public static $rules = [
        'trucktype_id' => 'required',
        'weight'=> 'required',
        'truck_no'=> 'required'

    ];

    // Don't forget to fill this array
    protected $fillable = ['trucktype_id','weight','picture_path','remarks','truck_no'];

    public function TruckType(){
        return $this->belongsTo('TruckType','trucktype_id');
    }
}

TruckType

class Trucktype extends \Eloquent {
    // Add your validation rules here
    public static $rules = array(
                    'type'         => 'required|unique:trucktypes,type',
                    'max_weight'   => 'required'
                );

    // Don't forget to fill this array
    protected $fillable = ['type','max_weight'];
}

我需要查找相关的表格记录,即TruckType

$trucksobj = Truck::with('TruckType');
if($truck_no!="")
    $trucksobj->where("truck_no",'=',$truck_no);
if($start_date!="" && $end_date!="")
    $trucksobj->whereBetween('created_at', array($start_date, $end_date));
if($truck_type!="")
    $trucksobj->where("trucktype_id",'=',$truck_type);
if($overweight=="on")
    $trucksobj->where('TruckType.max_weight', '>=', 0);

但是上面的查询没有解决TruckType.max_weight并抛出错误

SQLSTATE [42S22]:未找到列:1054未知列' TruckType.max_weight'在' where子句' (SQL:选择count(*)作为trucks的汇总,其中TruckTypemax_weight> = 0)

1 个答案:

答案 0 :(得分:0)

我认为你误解了with()实际上是如何运作的。它仅用于缓解N+1 query problem使表的内容可用于查询。在您的第一个查询运行以选择所有卡车后,with()只会导致以下查询自动运行:

select * from TruckType where TruckType.id in (...)

此处的结尾列表将包含您在第一个查询中找到的所有不同truck.trucktype_id值,然后它们会自动通过$truck->TruckType->{property}等方式供您使用

现在,如果您实际查看了为您生成的查询,您可以清楚地看到在任何地方都没有引用任何TruckType表:

select count(*) as aggregate from trucks where TruckType.max_weight >= 0

这就是抛出错误的原因。


您有两种选择:

(1)使用联接

$trucksobj = Truck::with('TruckType')->join('TruckType', 'truck.trucktype_id', '=', 'TruckType.id')->where('TruckType.max_weight', '>=', 0);

(2)使用whereHas()对您的关系施加约束

$trucksobj = Truck::with('TruckType')->whereHas('TruckType', function($q) {
  $q->where('max_weight', '>=', 0);
});

如果您实际上不需要了解卡车类型的任何信息,并且您只想用它来通过卡车进行筛选,那么您可以摆脱with('TruckType')并保留剩下的查询。