Laravel - красноречивая модель, как получить данные из таблицы отношений
Я разрабатываю приложение laravel, которое имеет следующие красноречивые модели
- Продукт 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.
}
Теперь мой вопрос: правильно ли эта логика? В этом случае все логики находятся в контроллере, поскольку im использует красноречивые модели. У меня есть модель для каждой таблицы, и в ней определены отношения. Есть ли способ получить все детали продукта/связанной модели (Детали продуктов (в таблице 1) + Детали Sku (в таблице 2)), а не использовать ниже
foreach($products as $product){
$products_id = $product->products_id;
$skus_data = Product::find($products_id)->skus;
}
Я новичок в разработке laravel и красноречивых моделях. Я буду использовать шаблон репозитория для разработки, и в этом случае будет существовать логика aboe (Product + Sku combining).
Пожалуйста, помогите.
Ответы
Ответ 1
Да, вы можете получить подробную информацию о продуктах и 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 );
}
Для вопроса о репозитории: если вы хотите использовать репозиторий, вы можете разместить часть своего кода в репозитории. Так, например, вы можете использовать этот метод внутри репозитория:
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();
}
Ответ 2
Если я правильно понимаю ваш вопрос, вы можете использовать нетерпеливую загрузку.
public function index()
{
$products = Product::with('skus')->get();
}
Это даст вам массив продуктов, которые имеют массив skus в каждом объекте продукта.
Ответ 3
Если используется шаблон репозитория, сделайте это следующим образом.
public function index() {
$data = $this->passportRepository->with('user')->findWhere(['id'=>1]);
}
Ответ 4
в laravel eloquent вы можете легко получать данные, используя отношения. если базовая структура вашего приложения полностью основана на красноречивых правилах laravel. тогда вы можете получить данные быстро и легко.