我正试图在Laravel 4中使用Eloquent做一些棘手的事情(至少对我来说)。为了在页面上进行细化,我需要获取一个或多个省份内的所有对象。现在我想弄清楚如何使用Eloquent为我检索这些信息(假设它是可能的)。我认为必须是这样的:
Object::whereIn('objectType', $objectTypeArray)->whereIn('cities.provinces.id', $provinceIdArray)->paginate(15);
这不起作用,因为它说Unknown column 'cities.provinces.id' in 'where clause'
。
以下模型用于实现此目的:
省
class Province extends Eloquent
{
protected $table = 'provinces';
public function cities(){
return $this->hasMany('City');
}
}
市
class City extends Eloquent
{
protected $table = 'cities';
public function province(){
return $this->belongsTo('Province');
}
public function object(){
return $this->hasMany('Object');
}
}
对象
class Object extends Eloquent
{
protected $table = 'objects';
public function city(){
return $this->belongsTo('City');
}
public function address(){
return $this->belongsTo('Address');
}
public function object_type(){
this->belongsTo('ObjectType');
}
}
对象类型
class OutgoingType extends Eloquent
{
protected $table = 'outgoing_types';
public function outgoing(){
return $this->hasMany('Object');
}
}
在此先感谢您的帮助,我一直在努力解决这个问题几个小时,但我似乎没有更接近正常运行的解决方案。
答案 0 :(得分:1)
如果您想使用模型中指定的Eloquent关系,那么我认为您需要使用
Object::with
急切加载关系(http://four.laravel.com/docs/eloquent#eager-loading)而不是
Object::whereIn
- > whereIn()需要有效的表列名,因此关于cities.provinces.id的错误不是city表中的有效列,它可能是cities.provinces_id,而Object :: with允许您加载与
等嵌套关系Object::with('city.province')->get().
使用这种方法添加约束有点棘手,因为您需要执行类似
的操作Object::with(array('city' => function($query)
{
$query->whereIn('city_id', $array);
}))->get();
另一种方法是坚持使用whereIn方法并使用数据库查询构建器中的一些更传统的连接http://four.laravel.com/docs/queries#joins
对不起,上面只是指针而不是实际的解决方案。
修改
刚刚玩了一个游戏,这似乎做你想做的事情:
Object::whereIn('object_type_id', $object_type_array)->with(array('city' => function($query) {
$query->whereIn('province_id', $province_id_array);
}))->get();
以上将取决于您的外键是object_type_id和province_id
第二次编辑
一种更传统的方法只能获得具有正确省份的城市的对象,而不是仅仅从结果集中的对象中排除城市:
$objects = Object::join('cities', 'city_id', '=', 'cities.id')
->whereIn('objects.object_type_id', $object_type_array)
->whereIn('cities.province_id', $province_id_array)->get()
可能有一种方法可以通过雄辩的对象关系实现相同的结果,但它现在却让我感到厌恶 - 无论如何,连接方法可能更有效。
格伦