Модель 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]);
}