Orm Laravel 4:通过查询关系选择是否存在关系的行

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

我试图查询products表,如果存在关系,则希望它返回集合

下面的迭代1查询产品表中的所有行,如果
$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).