php - estructura - laravel modelo de datos
Laravel modelo elocuente de cómo obtener datos de la tabla de relaciones (2)
Si entiendo tu pregunta correctamente, puedes usar la carga ansiosa.
public function index()
{
$products = Product::with(''skus'')->get();
}
Esto le dará una variedad de productos que tienen una matriz skus en cada objeto de producto.
Estoy desarrollando una aplicación laravel que tiene los siguientes modelos elocuentes
- Producto hasMany (''App / Sku'', ''products_id'')
- Sku belongTO (''Aplicación / Producto'')
Tengo un controlador ''ProductController'' donde está disponible el siguiente código
public function index()
{
$products = Product::all();
foreach($products as $product){
$products_id = $product->products_id;
}
}
Estoy exponiendo API RESTfull que permitirá a mis usuarios obtener todos los detalles del producto (incluidos skus, tipos de envío, etc.).
Supongamos que si tengo un API GET: / productos
El código que obtiene todos los detalles del producto será alguno de los siguientes
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.
}
Ahora mi pregunta es, ¿es esta lógica adecuada? En este caso, todas las lógicas están en el controlador, ya que estoy usando modelos elocuentes. Tengo un modelo para cada tabla y las relaciones están definidas en él. ¿Hay alguna manera de que pueda obtener todos los detalles de un producto / modelo asociado (detalles de los productos (en la tabla 1) + detalles de Sku (en la tabla 2) en lugar de utilizar el siguiente
foreach($products as $product){
$products_id = $product->products_id;
$skus_data = Product::find($products_id)->skus;
}
Soy bastante nuevo en el desarrollo de modelos y modelos elocuentes. Utilizaré el patrón de repositorio para el desarrollo y en ese caso donde reside la lógica anterior (combinación de Producto + Sku).
Por favor ayuda.
Sí, puede obtener los detalles de los productos y skus sin realizar una consulta adicional por producto utilizando carga ansiosa (esto se conoce como el problema típico de consulta N + 1 donde N es el número de productos)
Supongamos que la relación entre su modelo de Product
y Sku
es:
Producto
public function skus()
{
return hasMany(''App/Sku'',''products_id'');
}
Para buscar los datos de los productos junto con los datos sku, puede usar el método with
. En tu controlador:
Controlador
$products = Product::with(''skus'')->get();
Luego, en sus puntos de vista, puede obtener la información de esta manera:
Ver
foreach ($products as $product)
{
//$product->skus is a collection of Sku models
dd( $product->skus );
}
Para la pregunta del repositorio: si desea usar un repositorio, puede colocar la parte de acceso elocuente de su código dentro del repositorio. Entonces, por ejemplo, podrías tener este método dentro del repositorio:
ProductRepository
public function getProductsData()
{
//access eloquent from the repository
return Product::with(''skus'')->get();
}
entonces puedes usar tu repositorio en tu controlador:
Controlador
//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();
}