J'ai une nouvelle application Laravel 5.8. J'ai commencé à jouer avec l'orme éloquent et ses relations.
Il y a un problème tout de suite que j'ai rencontré. P>
J'ai les tables suivantes. (Ceci est juste un exemple, pour tester des raisons, ne sera pas une application réelle) p> Ce que je voulais, c'est d'obtenir l'adresse IP appartenant à la connexion réelle. p> donc j'ai ajouté un puis j'ai ajouté un relation code> relation avec la table de connexion code> qui a une clé étrangère pour la table de données code>: p>: p>
relation code> relation avec la table code> code> qui a une clé étrangère pour la table
IP code >: P>
Call to undefined method Illuminate\Database\Eloquent\Relations\HasOne::ip()
3 Réponses :
Vous pouvez essayer comme ceci:
$login = Login::with(['data.ip'])->find(1);
Malheureusement, je reçois ce message d'erreur: sqlstate [42s22]: colonne non trouvée: 1054 Colonne inconnue 'data.login_id' in 'where' (SQL: SELECT * à partir de "DATA". "LOGIN_ID ' (1)) code>
parce que vous avez utilisé méthode code>.
Avec votre structure de base de données: P>
Connexion Data DATA IP Après avoir corrigé vos méthodes, vous pouvez utiliser vos relations comme celle-ci p>
BEOPESTO code> DATA P>
hasone code> Connexion p>
APPARTSTO CODE> IP P>
hasone code> DATA P>
$ login = Connexion :: with (["data.ip ']) -> Recherche (1); Code> P>
Donc, si je comprends bien correctement, je dois toujours avoir un hasone d'appartenance + un hasone - et je ne peux pas en avoir un sans l'autre?
En outre, où devrais-je placer les clés étrangères? Ou est-ce que ça va comment je les ai maintenant?
@RADICAL_ACTIVE Veuillez vérifier laravel.com/docs/5.8/eloquent-relationships# un à un
Les relations de Laravel sont bidirectionnelles. Sur les relations CODE> ONE-T---ONE >, vous pouvez définir la relation directe ( et la relation inverse doit être: p> voir Eloquant: relations - une-une à une docs pour plus de détails sur la définition de la définition . P> Note Strong> que vous n'avez pas besoin de définir les deux directions pour une relation à moins d'avoir besoin. Dans votre cas, je pense que vous avez juste besoin de définir le p> p> Lorsque vous faites: p> Vous appelez la méthode Le correct est appelé la propriété de la relation magique à la place: p> Notez que nous n'avons pas " t Utilisez le Laravel Eloquant avoir un Loading désireux pour des relations très utiles dans certains cas, car il pré-charge vos relations et réduisez la quantité de requêtes que vous faites. P> Dans la situation que vous avez décrite (chargement d'un seul modèle C'est utile lorsque vous chargez quand vous chargez De nombreux modèles, ce qui réduit votre comptage de la requête de base de données à partir de Imaginez que vous chargez 100 avec le chargement impatient, il ne fera que 3 requêtes, ce qui entraînera une augmentation de la performance. . P> h1> hasone code>) et la relation inverse (
appartenante code>) p> < p> La relation directe doit être: p>
2e erreur: Vous appelez la méthode de la relation, pas la relation elle-même h1>
data code> qui définit votre relation, pas le modèle associé. Ceci est utile dans certains cas, mais pas sur votre cas. P>
() code> et nous n'avons pas besoin du
obtenez () code> ici. Laravel prend soin de le charger pour nous. P>
Utilisez le chargement impatient H2>
login code> modèle), il ne fait aucune amélioration de la performance, mais elle ne ralentit pas. P>
n + 1 code> à
2 code>. P>
Modèles de connexion code> CODE>, sans chargement impatiété, vous ferez une requête pour obtenir votre
login code> modèles, 100 requêtes pour obtenir votre
data code> modèles et plus 100 requêtes pour obtenir votre
ip code> modèles. p>
Amazing, merci pour l'explication descriptive, je comprends maintenant. Je pense que mon problème dans la pensée était que je pensais que la table code> code> est la table «Main» et le reste de celui-ci correspond à des parties de la table de connexion. Ce qui est vrai, mais il faut penser à l'inverser cette affaire. Quoi qu'il en soit, merci beaucoup pour cela, vous avez sauvé ma journée! :)