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. тогда вы можете получить данные быстро и легко.