Orm Laravel 4:通过查询关系选择是否存在关系的行
我试图查询products表,如果存在关系,则希望它返回集合 下面的迭代1查询产品表中的所有行,如果Orm Laravel 4:通过查询关系选择是否存在关系的行,orm,laravel,eloquent,Orm,Laravel,Eloquent,我试图查询products表,如果存在关系,则希望它返回集合 下面的迭代1查询产品表中的所有行,如果$name匹配,则惰性加载金属表。这是错误的 我的路线: Route::group(array('prefix' => '{api}/v1'), function() { Route::controller('products', 'Api\V1\ProductController'); }); 我的控制器: public function getFilter($metal = n
$name
匹配,则惰性加载金属表。这是错误的
我的路线:
Route::group(array('prefix' => '{api}/v1'), function()
{
Route::controller('products', 'Api\V1\ProductController');
});
我的控制器:
public function getFilter($metal = null) {
$products = $this->product;
if ($metal) {
$products->with('metal', function($query, $metal) {
$query->where('name', $metal);
});
}
return Response::api($products->get());
}
如果metal.name=$metal
,我只希望显示$products
。e、 g.类似于:
$this->products->where('metal.name', $metal)->get;
使用乐于助人部分答案的解决方案:
这提供了一种替代方法2,不需要连接
不幸的是,你还不能用雄辩的一击来完成这一任务 但是,有一种方法是使用反向关系,如下所示:
public function getFilter($metal = null)
{
// filter the metals first
$metals = Metal::with('products')->where('name', '=' , $metal)->get();
$products = array();
foreach($metals as $metal)
{
// collect the products from the filtered metals
$products = array_merge($products, $metal->products->toArray() );
}
return $products;
}
如果这对您来说不是一个优雅的解决方案,那么您必须使用Fluent来构造查询并手动连接products x metals表,或者通过重写newQuery()方法预连接它们
1) 备选办法一
public function getFilter($metal = null) {
return DB::table('products')->join('metal', 'products.id', '=' , 'metal.product_id')
->where('metal.name', $name)
->select(array('products.*'));
}
2) 备选办法二
class Product extends Eloquent{
public function newQuery($excludeDeleted = true){
return parent::newQuery()->join('metal','id','=','metal.product_id');
}
}
请查看,请参见“渴望加载约束”。尝试将数组传递给with函数:$products->with(数组('metal')=>函数($query)use($metal).