0
votes

Confus avec les relations éloquentes de Hasone de Laravel

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> xxx pré>

Ce que je voulais, c'est d'obtenir l'adresse IP appartenant à la connexion réelle. p>

donc 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> xxx pré>

puis j'ai ajouté un 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()


0 commentaires

3 Réponses :


1
votes

Vous pouvez essayer comme ceci:

Connexion strong> p> xxx pré>

strong> p>

$login = Login::with(['data.ip'])->find(1);


2 commentaires

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))


parce que vous avez utilisé méthode .



2
votes

Avec votre structure de base de données:

Connexion BEOPESTO DATA

Data hasone Connexion

DATA APPARTSTO IP

IP hasone DATA

Après avoir corrigé vos méthodes, vous pouvez utiliser vos relations comme celle-ci

$ login = Connexion :: with (["data.ip ']) -> Recherche (1);


3 commentaires

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



5
votes

1ère erreur: mauvaise définition de relation

Les relations de Laravel sont bidirectionnelles. Sur les relations ONE-T---ONE , vous pouvez définir la relation directe ( hasone ) et la relation inverse ( appartenante ) < p> La relation directe doit être: xxx

et la relation inverse doit être: xxx

voir Eloquant: relations - une-une à une docs pour plus de détails sur la définition de la définition .

Note 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

2e erreur: Vous appelez la méthode de la relation, pas la relation elle-même

Lorsque vous faites: xxx

Vous appelez la méthode data qui définit votre relation, pas le modèle associé. Ceci est utile dans certains cas, mais pas sur votre cas.

Le correct est appelé la propriété de la relation magique à la place: xxx

Notez que nous n'avons pas " t Utilisez le () et nous n'avons pas besoin du obtenez () ici. Laravel prend soin de le charger pour nous.

Utilisez le chargement impatient

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.

Dans la situation que vous avez décrite (chargement d'un seul modèle login modèle), il ne fait aucune amélioration de la performance, mais elle ne ralentit pas.

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 n + 1 à 2 .

Imaginez que vous chargez 100 Modèles de connexion , sans chargement impatiété, vous ferez une requête pour obtenir votre login modèles, 100 requêtes pour obtenir votre data modèles et plus 100 requêtes pour obtenir votre ip modèles.

avec le chargement impatient, il ne fera que 3 requêtes, ce qui entraînera une augmentation de la performance. .


1 commentaires

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 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! :)