2017-09-24 1 views
0

Aujourd'hui, je voulais faire du code propre, alors j'ai juste commencé à sélectionner des colonnes pour la relation. Avec ce code:Relation Laravel avec la méthode "with" renvoie null

\App\Genre::with([ 
    'family' 
     ])->where([ 
     'slug' => $slug, 
     'is_active' => true 
     ])->first(); 

tout fonctionne bien. Mais quand je commence à sélectionner des colonnes pour « avec » méthode:

\App\Genre::with([ 
    'family' => function ($query) { 
     $query->select('name_pl', 'name_lat'); 
    }])->where([ 
     'slug' => $slug, 
     'is_active' => true 
    ])->first(); 

J'obtenu que la famille est nulle (mais il devrait être un objet avec des colonnes: name_pl, name_lat). Qu'est ce que je fais mal?

méthode familiale en classe Genre ressemble à ceci:

public function family() { 
    return $this->belongsTo(Family::class); 
} 

J'utilise Laravel 5.4

Répondre

1

Pourquoi ne pas essayer:

\App\Genre::with('family:name_pl,name_lat')->where([ 
    'slug' => $slug, 
    'is_active' => true 
])->first(); 
+1

Wow, je ne savais pas à ce sujet. Ça marche plutôt bien, merci! –

1

Jolie que vous devez ajouter un Dans le cas contraire, Laravel ne pourra pas faire correspondre les données avec la charge désirée.

En supposant que Genre a une family_id et Family a une clé primaire spécifiée dans la colonne id, vous avez besoin ceci:

$query->select('id', 'name_pl', 'name_lat'); // See the id added here? 

devrait faire l'affaire.

Pour plus de clarté, la mise en correspondance I mentionné est celui-ci:

select * from genre 

select * from family where id in (1, 2, 3, 4, 5, ...) 

- où la liste séparée par des virgules des ID comprend les family_id uniques valeurs récupérées dans la première requête.

+0

Oui, vous avez raison mais je préfère toujours les solutions de Hazem Emad. Il semble un peu plus intelligent. –