我正在开发一个具有以下雄辩模型的laravel应用程序
产品hasMany('App/Sku','products_id')
Sku belongsTO('App/Product')
我有一个控制器'ProductController',其中提供以下代码
public function index() { $products = Product::all(); foreach($products as $product){ $products_id = $product->products_id; } }
我正在公开RESTfull API,这将允许我的用户获得所有产品详细信息(包括skus,运输类型等).
假设我有一个API GET:/ products
获取所有产品详细信息的代码将是以下内容
public function index() { $products = Product::all(); foreach($products as $product){ $products_id = $product->products_id; $skus_data = Product::find($products_id)->skus; } // Now I have both the product details + skus which I can bundle into an array/json. }
现在我的问题是,这个逻辑是否合适?在这种情况下,所有逻辑都在控制器中,因为我使用了雄辩的模型,我为每个表都有一个模型,并在其中定义了关系.有没有办法可以获得产品/相关模型的所有细节(产品详情(表1)+ Sku详细信息(表2))而不是使用下面的
foreach($products as $product){ $products_id = $product->products_id; $skus_data = Product::find($products_id)->skus; }
我对laravel开发和雄辩的模型都很陌生.我将使用存储库模式进行开发,在这种情况下,aboe逻辑(Product + Sku组合)所在的位置.
请帮忙.
是的,您可以获取产品和skus的详细信息,而无需使用预先加载对每个产品进行一次额外查询 (这称为典型的N + 1查询问题,其中N是产品的数量)
假设您Product
和Sku
模型模型之间的关系是:
产品
public function skus() { return hasMany('App/Sku','products_id'); }
要获取产品数据以及sku数据,您可以使用该with
方法.在你的控制器中:
调节器
$products = Product::with('skus')->get();
然后,在您的视图中,您可以通过这种方式获取信息:
视图
foreach ($products as $product) { //$product->skus is a collection of Sku models dd( $product->skus ); }
对于存储库问题:如果要使用存储库,可以将代码的eloquent-access部分放在存储库中.因此,例如,您可以在存储库中使用此方法:
ProductRepository
public function getProductsData() { //access eloquent from the repository return Product::with('skus')->get(); }
那么您可以在控制器中使用您的存储库:
调节器
//inject the repository in the controller public function __construct( ProductRepository $productRepo ) { $this->productRepo = $productRepo; } //use the injected repository to get the data public function index() { $products = this->productRepo->getProductsData(); }