Модель Laravel eloquent как получить данные из таблицы relationship
Я разрабатываю приложение laravel, которое имеет следующие красноречивые модели
- продукт hasMany ('App/Sku','products_id')
- Sku belongTO ('приложение/продукт')
у меня есть контроллер "ProductController", где доступен следующий код
public function index()
{
$products = Product::all();
foreach($products as $product){
$products_id = $product->products_id;
}
}
я подвергаю RESTfull API, который позволит моим пользователям получать все сведения о продукте (включая skus, типы доставки так далее..).
предположим, если у меня есть API GET: / продукты
код, который извлекает все детали продукта, будет следующим
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 (объединение продукта+Sku).
пожалуйста, помогите.
3 ответов
Да, вы можете получить детали продуктов и skus без делать один дополнительный запрос в продукт используя предвыборка ( это называется типичным N+1 проблема запроса где N-количество продуктов)
предположим, что отношения между Product
и Sku
модели модели:
продукт
public function skus()
{
return hasMany('App/Sku','products_id');
}
для извлечения данных товаров наряду с данными СКУ можно использовать 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();
}
Если я правильно понял ваш вопрос, вы можете использовать жадную загрузку.
public function index()
{
$products = Product::with('skus')->get();
}
Это даст вам массив продуктов, которые имеют массив skus в каждом объекте продукта.
Если используется шаблон репозитория, так используется вот так.
public function index()
{
$data=$this->passportRepository->with('user')->findWhere( ['id'=>1]);
}