1
votes

Laravel avec ([]) ne sélectionne que quelques colonnes de la relation

Cette question est unique car elle pose des problèmes uniques tels que:

  1. relations dans les composants with. (items.product.stockManagement).
  2. Un grand nombre de composants, cela fait que les réponses acceptées de la question liée ne s'appliquent pas.

Supposons que vous ayez un grand avec () comme ceci:

$order = Order::with([
        'company',   // select only id,name, size
        'complaints',  // select only id, name , body
        'person',     
        'items',  
        'items.product',  // select only id, name , price
        'items.product.stockManagement',
        'status',  // select only id
        'items.product.media',
        'items.product.mainProduct',
        'items.product.mainProduct.media'
    ])->findOrFail($id);

Comment puis-je ensuite sélectionner avec toutes leurs relations mais des colonnes spécifiques pour certaines d'entre elles ?

$order = Order::with([
        'company',
        'complaints',
        'person',
        'items',
        'items.product',
        'items.product.stockManagement',
        'status', 
    ])->findOrFail($id);


3 Réponses :


5
votes

Comme ceci:

$books = App\Book::with('author:id,name')->get();

Le la documentation est très brève sur le chargement de colonnes spécifiques (vous devez même faire défiler un peu vers le bas jusqu'à l'en-tête qui dit "Eager Loading Specific Columns").

Il se peut que vous n'ayez pas toujours besoin de toutes les colonnes des relations que vous récupérez. Pour cette raison, Eloquent vous permet de spécifier les colonnes de la relation que vous souhaitez récupérer:

$order = Order::with([
    'company:id,name,size',
    'complaints:id,name,body',
    'person',     
    'items',  
    'items.product:id,name,price',
    'items.product.stockManagement',
    'status:id',
    'items.product.media',
    'items.product.mainProduct',
    'items.product.mainProduct.media'
])->findOrFail($id);

Remarque:

Lorsque vous utilisez cette fonctionnalité, vous devez toujours inclure la colonne id et toutes les colonnes de clé étrangère pertinentes dans la liste des colonnes que vous souhaitez récupérer.


3 commentaires

Veuillez décrire votre réponse.


@unclexo mieux?


Oui c'est le cas. Merci beaucoup!



2
votes

Vous pouvez également fournir un rappel pour des requêtes de relations plus avancées.

Order::with([
    'company' => function ($q) {
         $q->select('id', 'name');
    }
])


0 commentaires

0
votes
$order = Order::with(
['company' => function($query) {
    $query->select('id','name','size')
 }),
'complaints' => function($query) {
    $query->select('id','name','body')
 }),
'person',    
'items',  
'items.product'  => function($query) {
    $query->select('id','name','price')
 }), 'items.product.stockManagement','status'=> function($query) {
    $query->select('id')
 }),'items.product.media', 'items.product.mainProduct', 'items.product.mainProduct.media'])->findOrFail($id);

0 commentaires