Laravel eloquent 模型如何从关系中获取数据 table
Laravel eloquent model how to get data from relationship's table
我正在开发一个 laravel 应用程序,它具有以下 eloquent 个模型
- Product hasMany('App/Sku','products_id')
- Sku 属于TO('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.
}
现在我的问题是,这个逻辑是否正确?在这种情况下,所有逻辑都在控制器中,因为我使用 eloquent 模型,我为每个 table 都有一个模型,并且在其中定义了关系。有没有一种方法可以获得 product/associated 模型的所有详细信息(产品详细信息(在 table 1 中)+ Sku 详细信息(在 table 2 中))而不是使用下面的
foreach($products as $product){
$products_id = $product->products_id;
$skus_data = Product::find($products_id)->skus;
}
我对 laravel 开发和 eloquent 模型还很陌生。我将使用存储库模式进行开发,在这种情况下,aboe 逻辑(Product+Sku 组合)位于何处。
请大家帮忙
是的,您可以使用 eager loading 获取产品和 SKU 的详细信息,而无需对每个产品进行一次额外查询
(这被称为典型的 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();
}
如果我理解正确你的问题,你可以使用预加载。
public function index()
{
$products = Product::with('skus')->get();
}
这将为您提供一组产品,每个产品对象中都有一个 skus 数组。
如果使用存储库模式,请按此操作。
public function index() {
$data = $this->passportRepository->with('user')->findWhere(['id'=>1]);
}
你可以试试这个:
public function index()
{
$products = Product::all();
foreach($products->skus as $product)
{
return $product;
}
}
这将为您提供对象形式的准确结果。
我正在开发一个 laravel 应用程序,它具有以下 eloquent 个模型
- Product hasMany('App/Sku','products_id')
- Sku 属于TO('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.
}
现在我的问题是,这个逻辑是否正确?在这种情况下,所有逻辑都在控制器中,因为我使用 eloquent 模型,我为每个 table 都有一个模型,并且在其中定义了关系。有没有一种方法可以获得 product/associated 模型的所有详细信息(产品详细信息(在 table 1 中)+ Sku 详细信息(在 table 2 中))而不是使用下面的
foreach($products as $product){
$products_id = $product->products_id;
$skus_data = Product::find($products_id)->skus;
}
我对 laravel 开发和 eloquent 模型还很陌生。我将使用存储库模式进行开发,在这种情况下,aboe 逻辑(Product+Sku 组合)位于何处。
请大家帮忙
是的,您可以使用 eager loading 获取产品和 SKU 的详细信息,而无需对每个产品进行一次额外查询 (这被称为典型的 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();
}
如果我理解正确你的问题,你可以使用预加载。
public function index()
{
$products = Product::with('skus')->get();
}
这将为您提供一组产品,每个产品对象中都有一个 skus 数组。
如果使用存储库模式,请按此操作。
public function index() {
$data = $this->passportRepository->with('user')->findWhere(['id'=>1]);
}
你可以试试这个:
public function index()
{
$products = Product::all();
foreach($products->skus as $product)
{
return $product;
}
}
这将为您提供对象形式的准确结果。