我有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
的汇总,其中TruckType
。max_weight
> = 0)
答案 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')
并保留剩下的查询。