


Résolvez le problème que les données associées sont vides dans la relation éloquente: assurez-vous que la clé étrangère est sélectionnée
Description du problème
Dans les applications Laravel, lors de la tension de précharger les données associées (telles que les fichiers et les modèles d'utilisateurs) via la méthode avec () éloquente, et en utilisant la méthode SELECT () dans la requête du modèle principal (cours), vous pouvez rencontrer la situation où les données associées renvoie NULL. Même si la relation d'association est correctement définie dans le modèle et que les clés étrangères existent réellement dans la base de données, Eloquent ne peut pas établir la carte d'association correcte en mémoire car la requête principale ne sélectionne pas ces colonnes de clés étrangères.
Considérez le scénario suivant: nous voulons obtenir l'ID, CourseDisplayName, et à peu près les colonnes de la table de cours, et préchargez leurs fichiers associés (obtenez l'ID, nom de fichier, filepath) et utilisateur (obtenez l'ID, nom) en même temps.
Le code de requête éloquent initial peut ressembler à ceci:
$ cours = cours :: avec (['fichiers: id, nom de fichier, filepath', 'utilisateur: id, nom']) -> SELECT ('ID', 'CoursedisplayName', 'AboutCourse') -> où ('userId', $ request-> tutorid) -> get ();
Le modèle de cours correspondant définit la relation d'appartenance avec les fichiers et l'utilisateur:
// modèle de cours Le cours de classe étend le modèle { Fichiers de fonction publique () { return $ this-> appartenance (fichiers :: class, 'fileId', 'id'); } Fonction publique User () { return $ this-> appartenance (user :: class, 'userId', 'id'); } }
Bien que la définition de la relation soit correcte, dans les résultats de sortie de la requête ci-dessus, les données associées aux fichiers et à l'utilisateur sont affichées comme nuls:
[ { "id": 20, "CoursedisplayName": "asasasb", "À propos de cours": nul, "fichiers": null, // attendez des données, mais null "utilisateur": null // attendez des données, mais null }, { "id": 14, "CoursedisplayName": "Yuu", "À propos de cours": "kljkl", "fichiers": null, "utilisateur": null } ]]
Analyse de la cause du problème
La cause profonde de ce problème est que lorsque l'éloquente précharge les données associées, il doit s'appuyer sur des colonnes de clés étrangères dans les résultats de requête du modèle principal pour correspondre et lier le modèle associé. Lorsque vous utilisez explicitement la méthode SELECT () dans la requête du modèle principal et que vous ne contenez pas de colonnes de clés étrangères pour établir l'association (comme FileID et UserId), Elogent ne peut pas obtenir ces informations de connexion critiques.
Plus précisément, Course :: avec ([«Fichiers», «Utilisateur»]) exécutera d'abord la requête principale pour obtenir l'enregistrement du cours. Eloquent collecte ensuite les valeurs FileID et UserId dans ces enregistrements de cours et les utilise pour effectuer des requêtes distinctes (ou dans certains cas, joignez-vous aux opérations) pour obtenir les fichiers et les enregistrements utilisateur correspondants. Si FileID et UserId ne sont pas dans l'ensemble de résultats de la requête principale, Eloquent ne peut pas créer des requêtes d'association ultérieures, et les données d'association récupérées ne peuvent pas être correctement "injectées" dans l'objet de cours correspondant.
Solution
La solution à ce problème est très simple: dans l'instruction SELECT () du modèle principal, en plus de sélectionner la colonne de données commerciales souhaitée, toutes les colonnes de clés étrangères utilisées pour établir l'association doivent également être incluses.
Pour cet exemple, le modèle de cours associe le modèle de fichiers via FileID et le modèle utilisateur via UserId. Par conséquent, dans la méthode Select (), FileId et UserId doivent également être inclus.
Le code de requête éloquent corrigé est le suivant:
$ cours = cours :: avec (['fichiers: id, nom de fichier, filepath', 'utilisateur: id, nom']) -> SELECT ('ID', 'CourseDisplayName', 'AboutCourse', 'UserId', 'FileId') // Ajouter 'Userid' et 'FileId' -> où ('userId', $ request-> tutorid) -> get ();
En ajoutant UserId et FileID dans l'instruction SELECT, Eloquent peut obtenir ces valeurs de clé étrangère tout en obtenant l'enregistrement du cours. De cette façon, lorsque Eloquent essaie de charger des fichiers et des associations utilisateur, il peut utiliser correctement ces valeurs de clé étrangère pour effectuer des requêtes d'association ultérieures et ramener les résultats à l'objet de cours.
Notes et meilleures pratiques
- Nécessité des touches étrangères: Lorsque vous utilisez la méthode Select () pour le modèle principal, il est important de se rappeler que toute clé étrangère utilisée pour précharger des associations avec () doit être incluse dans la liste de colonnes de Select ().
- Comportement par défaut: si votre requête éloquente n'utilise pas la méthode SELECT (), Eloquent sélectionnera toutes les colonnes du tableau par défaut (SELECT *) et dans ce cas, les touches étrangères seront généralement incluses, de sorte que ce problème ne se produira pas.
- Considérations de performance: Bien que les clés étrangères soient nécessaires pour résoudre le problème de l'association, dans les applications pratiques, le principe de sélection des colonnes nécessaires doit toujours être suivi pour optimiser les performances de la requête et réduire la consommation de mémoire. Évitez de sélectionner inutilement toutes les colonnes, sauf si vous en avez vraiment besoin.
- Association à plusieurs niveaux: s'il existe une association à plusieurs niveaux (par exemple, cours -> fichiers -> FileOrner), lors du préchargement de fichier, vous devez également vous assurer que la clé étrangère utilisée pour associer le propriétaire de fichiers dans le modèle de fichiers est sélectionnée (si le modèle de fichiers utilise également SELECT ()).
- Lisibilité et maintenance: pour la lisibilité du code et la maintenance future, il est recommandé que toutes les colonnes de clés étrangères liées aux relations soient explicitement répertoriées dans la méthode SELECT (), même si elles ne sont pas strictement requises dans certains cas (par exemple, lorsque Select () n'est pas utilisé).
Résumer
Lorsque vous utilisez Laravel éloquent pour les requêtes de données et le préchargement d'association, si l'ensemble de résultats du modèle principal est filtré (c'est-à-dire que la méthode select () est utilisée), assurez-vous d'inclure toutes les colonnes de clés étrangères utilisées pour établir des associations dans la liste de Select (). Il s'agit d'une étape critique pour s'assurer qu'Eloquent reconnaît et charge correctement les données associées. Suivre ce principe peut éviter efficacement le problème des données associées vides causées par les clés étrangères manquantes, créant ainsi une application Laravel robuste et efficace.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Créer un tableau de références pour enregistrer les relations de recommandation, y compris les références, les références, les codes de recommandation et le temps d'utilisation; 2. Définir l'appartenance et les relations HasMany dans le modèle d'utilisateur pour gérer les données de recommandation; 3. Générer un code de recommandation unique lors de l'enregistrement (peut être implémenté via des événements modèles); 4. Capturez le code de recommandation en interrogeant les paramètres lors de l'enregistrement, établissez une relation de recommandation après vérification et empêchez l'auto-recommandation; 5. Déclencher le mécanisme de récompense lorsque les utilisateurs recommandés terminent le comportement spécifié (ordre d'abonnement); 6. Générer des liens de recommandation partageables et utiliser les URL de signature Laravel pour améliorer la sécurité; 7. Afficher les statistiques de recommandation sur le tableau de bord, telles que le nombre total de recommandations et de nombres convertis; Il est nécessaire de s'assurer que les contraintes de base de données, les séances ou les cookies sont persistées,

ChoOSEAFEUREFLAGSTATTECYSUCHASCONFIG, basé sur la base de données, Orthird-PartyToolsLILLFlagsmith.2.SetUpadatabase-DrivensystemByCreatAmamigrationForaFeate_Flagstablewithname, Activé, Andrulesfields, Therunthemigration.3.CreateafateAtteflagModelwithe

Créer un nouveau projet Laravel et démarrer le service; 2. Générez le modèle, la migration et le contrôleur et exécuter la migration; 3. Définissez l'itinéraire RESTful dans les routes / api.php; 4. Implémentez la méthode d'addition, de suppression, de modification et de requête dans Post Controller et renvoyez la réponse JSON; 5. Utilisez Postman ou Curl pour tester la fonction API; 6. Ajouter éventuellement l'authentification de l'API via Sanctum; Enfin, obtenez une structure claire, Laravelrestapi complète et extensible, adaptée aux applications pratiques.

Le modèle de référentiel est un modèle de conception utilisé pour découpler la logique métier à partir de la logique d'accès aux données. 1. Il définit les méthodes d'accès aux données via des interfaces (contrat); 2. Les opérations spécifiques sont implémentées par la classe de référentiel; 3. Le contrôleur utilise l'interface par injection de dépendance et ne contacte pas directement la source de données; 4. Les avantages incluent un code soigné, une testabilité solide, une maintenance facile et une collaboration d'équipe; 5. Applicable aux projets moyens et grands, les petits projets peuvent utiliser directement le modèle.

Eloquentorm est le système de cartographie relationnel d'objet intégré de Laravel. Il exploite la base de données via la syntaxe PHP au lieu de SQL native, ce qui rend le code plus concis et plus facile à maintenir; 1. Chaque tableau de données correspond à une classe de modèle, et chaque enregistrement existe comme instance de modèle; 2. Adopter le mode d'enregistrement actif et l'instance du modèle peut être enregistrée ou mise à jour par elle-même; 3. Prise en charge de l'affectation par lots et l'attribut à remplissage $ doit être défini dans le modèle pour garantir la sécurité; 4. Fournir un fort soutien relationnel, comme un à un, un-à-plusieurs, plusieurs à plusieurs, etc., et vous pouvez accéder aux données associées via des appels de méthode; 5. Constructeur de requête intégré, où, OrderBy et d'autres méthodes peuvent être appelés enchaînés pour construire des requêtes; 6. Prise en charge des accessoires et des modificateurs, qui peuvent formater le numéro lors de l'obtention ou de la définition d'attributs.

AccessorsandMutatorsInLaravel'SeloventoralLowyoutOrOrorManipulateModelatRributes Pendant ce temps

Utilisez des formulaires pour extraire la logique de vérification de formulaire complexe du contrôleur, améliorant la maintenabilité du code et la réutilisabilité. 1. Méthode de création: générer la classe de demande via la commande artisan make: demande; 2. Règles de définition: définir la logique de vérification du champ dans la méthode des règles (); 3. Utilisation du contrôleur: recevez directement les demandes avec cette classe en tant que paramètre, et Laravel vérifie automatiquement; 4. Jugement d'autorisation: Contrôler les autorisations des utilisateurs via la méthode Authorize (); 5. Règles d'ajustement dynamique: renvoyez dynamiquement différentes règles de vérification en fonction du contenu de la demande.

LaraveLolientsSupportsSubQueriesInselect, d'où, et d'orderByClauses, permettant à la FlexibledataRetrievalwithoutrawsql; 1.Useesectsub () ToaddCompuledColumns likepostcountperUser; 2.Usefromsub () OrclosionInfrom () totaleaTSubQueryArableforgouredData;
