我正在开发一个具有以下雄辩模型的laravel应用程序
我有一个控制器'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组合)驻留在哪里。
请帮忙。
答案 0 :(得分:20)
是的,您可以使用eager loading获取产品和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();
}
答案 1 :(得分:1)
如果我正确理解您的问题,您可以使用预先加载。
public function index()
{
$products = Product::with('skus')->get();
}
这将为您提供一系列产品,每个产品对象都有一个skus数组。
答案 2 :(得分:1)
如果使用了存储库模式,请执行此操作。
public function index() {
$data = $this->passportRepository->with('user')->findWhere(['id'=>1]);
}
答案 3 :(得分:0)
您可以尝试以下方法:
public function index()
{
$products = Product::all();
foreach($products->skus as $product)
{
return $product;
}
}
这将以对象形式给出确切的结果。