0

I am trying to query a products table, and want it to return a collection if a relation exists.

Iteration 1 below queries all rows in the products table, and lazy loads the metals table if $name matches. This is wrong.

My Route:

Route::group(array('prefix' => '{api}/v1'), function()
{
    Route::controller('products', 'Api\V1\ProductController');
});

My Controller:

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());
} 

I want only $products to display if metal.name = $metal. e.g. something like:

$this->products->where('metal.name', $metal)->get;

Solution using part of Glad To Help's answer:

This provides an alternative approach 2, without the need for joins.

http://paste.laravel.com/WC4

4

1 回答 1

1

Unfortunately you cannot do this with one swipe in Eloquent yet.

BUT, there is a way by using the inverse relation, like this:

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;
}

If this is not elegant solution for you, you will either have to use Fluent to construct the query and join the products x metals table manually or pre-join them by overriding the newQuery() method.

1) alternative approach one.

public function getFilter($metal = null) {
    return DB::table('products')->join('metal', 'products.id', '=' , 'metal.product_id')
                         ->where('metal.name', $name)
                         ->select(array('products.*'));
}

2) alternative approach two

class Product extends Eloquent{

public function newQuery($excludeDeleted = true){
        return parent::newQuery()->join('metal','id','=','metal.product_id');
    }

}
于 2013-10-04T14:36:28.260 回答