Je développe une application laravel qui a les modèles éloquents suivants
J'ai un contrôleur 'ProductController' où le code suivant est disponible
public function index()
{
$products = Product::all();
foreach($products as $product){
$products_id = $product->products_id;
}
}
J'expose l'API RESTfull qui permettra à mes utilisateurs d'obtenir tous les détails du produit (y compris les skus, les types d'expédition, etc.).
Supposons que si j'ai une API GET:/products
Le code qui va chercher tous les détails du produit sera ce que ce qui suit
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.
}
Ma question est la suivante: cette logique est-elle appropriée? Dans ce cas, toutes les logiques sont dans le contrôleur depuis que j’utilise des modèles éloquents, j’ai un modèle pour chaque table et les relations y sont définies. Est-il possible d'obtenir tous les détails d'un produit/modèle associé (détails des produits (dans le tableau 1) + détails du sku (dans le tableau 2)) au lieu d'utiliser les éléments ci-dessous?
foreach($products as $product){
$products_id = $product->products_id;
$skus_data = Product::find($products_id)->skus;
}
Je suis assez nouveau pour le développement de laravel et les modèles éloquents. Je vais utiliser un modèle de référentiel pour le développement et dans ce cas, où réside la logique ci-dessus (combinaison produit/sku).
S'il vous plaît aider.
Oui, vous pouvez obtenir les détails des produits et skus sans faire une requête supplémentaire par produit en utilisant eager loading (on parle de problème de requête N + 1} _ typique où N est le nombre de produits)
Supposons que la relation entre vos modèles Product
et Sku
soit:
Produit
public function skus()
{
return hasMany('App/Sku','products_id');
}
Pour récupérer les données de produits avec les données de sku, vous pouvez utiliser la méthode with
. Dans votre contrôleur:
Manette
$products = Product::with('skus')->get();
Ensuite, à votre avis, vous pouvez obtenir les informations de cette façon:
Vue
foreach ($products as $product)
{
//$product->skus is a collection of Sku models
dd( $product->skus );
}
Pour la question sur le référentiel: si vous voulez utiliser un référentiel, vous pouvez placer la partie éloquent-access de votre code dans le référentiel. Ainsi, par exemple, vous pourriez avoir cette méthode dans le référentiel:
ProductRepository
public function getProductsData()
{
//access eloquent from the repository
return Product::with('skus')->get();
}
alors vous pouvez utiliser votre référentiel dans votre contrôleur:
Manette
//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();
}
Si je comprends bien votre question, vous pouvez utiliser le chargement rapide.
public function index()
{
$products = Product::with('skus')->get();
}
Cela vous donnera un tableau de produits qui ont un tableau de skus dans chaque objet produit.
Si utilisé, le modèle de référentiel est utilisé comme ceci.
public function index()
{
$data=$this->passportRepository->with('user')->findWhere( ['id'=>1]);
}