2013-11-26 47 views
3

我得到了產品和庫存表;如何訂購另一張表通過在Laravel中急於加載

產品

id int 
name varchar 
created_at timestamp 

id int 
name varchar 
product_id varchar 
created_at timestamp 

產品型號

public function validStock() { 
    return $this->hasMany('Stock')->where('quantity', '>', 10); 
} 

如果都有科瑞ed_at,如何通過股市的created_at訂購,我已經嘗試了兩種方法,它不是工作

Product::with('validStock')->orderBy('validStock.created_at', 'DESC'); 

Product::with(array('validStock' => function($q) { 
    $q->orderBy('created_at', 'DESC'); 
})); 
+0

https://github.com/fico7489/laravel-eloquent-join – fico7489

回答

0

你應該在封閉返回$ Q:

Product::with(array('validStock' => function($q) { 
    return $q->orderBy('created_at', 'DESC'); 
})); 
+0

這似乎沒有在我的測試中做任何事情。你可以擴展這個嗎? – tremby

1

您不能將訂單在查詢在Laravel一個熱切的關係。查詢完成後,您可以訂購集合。

$products = Product::with(array('validStock')) 
    ->get() 
    ->each(function ($product) 
    { 
     $product->validStock = $product->validStock 
      ->sortBy(function ($validStock) 
      { 
       return $validStock->created_at; 
      }) 
      ->reverse(); 
    }); 
3

不是檢索所有的數據(這是不可能的分頁結果時,以一種有效的方式做),你可以使用一個連接後分類的。

(這個答案是基於this one。)

Product::with('validStock') 
    ->join('stocks', 'stocks.product_id', '=', 'products.id') 
    ->select('products.*') // Avoid selecting everything from the stocks table 
    ->orderBy('stocks.created_at', 'DESC') 
    ->get(); 

我不喜歡這個唯一的事情是,它帶走了一些數據庫抽象的,因爲你必須寫你的表名這裏。

請注意,我沒有在這個方向嘗試使用hasMany關係,因爲您在示例中選擇了它(每個產品都有很多股票)。我只在hasMany的另一個方向上嘗試過(例如選擇股票,每個股票只有一個產品)。