Explication détaillée de la solution à l'identifiant d'erreur renvoyé par la requête associée à Laravel en PHP

墨辰丷
Libérer: 2023-03-27 19:04:02
original
1636 Les gens l'ont consulté

Cet article présente principalement la solution à l'identifiant d'erreur renvoyé par la requête associée à Laravel. Il est très bon et a une valeur de référence. Les amis qui en ont besoin peuvent s'y référer

Utilisez la requête associée de jointure dans Laravel Eloquent. Si deux Si une table a un champ avec le même nom, tel que id, alors sa valeur sera écrasée par un champ ultérieur portant le même nom par défaut et le résultat renvoyé n'est pas attendu. Par exemple, la requête associée suivante :

PHP

$priority = Priority::rightJoin('touch', 'priorities.touch_id', '=', 'touch.id')
 ->where('priorities.type', 1)
 ->orderBy('priorities.total_score', 'desc')
 ->orderBy('touch.created_at', 'desc')
 ->get();
Copier après la connexion
Copier après la connexion

$priority = Priority::rightJoin('touch', 'priorities.touch_id', '=', 'touch.id')
 ->where('priorities.type', 1)
 ->orderBy('priorities.total_score', 'desc')
 ->orderBy('touch.created_at', 'desc')
 ->get();
Copier après la connexion
Copier après la connexion

Les priorités et touch les deux tables ont des champs d'identification. Si la requête est construite comme ceci, les résultats de la requête renvoyés sont les suivants :

Laravel 关联查询返回错误的 id

Requête liée à Laravel Renvoie le mauvais identifiant

La valeur de id ici n'est pas le champ id de la table des priorités, mais le champ id de la table tactile Si l'instruction SQL exécutée est imprimée :

select * from `priorities` 
right join `touch` 
on `priorities`.`touch_id` = `touch`.`id` 
where `priorities`.`type` = '1' 
order by `priorities`.`total_score` desc, `touch`.`created_at` desc
Copier après la connexion
Copier après la connexion

select * from `priorities` 
right join `touch` 
on `priorities`.`touch_id` = `touch`.`id` 
where `priorities`.`type` = '1' 
order by `priorities`.`total_score` desc, `touch`.`created_at` desc
Copier après la connexion
Copier après la connexion

Les résultats de la requête sont tels qu'indiqués dans la figure :

Requête utilisant SQL Le résultat est en fait correct. Le champ id avec le même nom dans une autre table est nommé id1 par défaut. Cependant, la valeur id renvoyée par Laravel n'est pas le champ id dans le. image, mais le champ avec le même nom dans l'autre table a écrit.

La solution est d'ajouter une méthode select pour spécifier le champ et construire correctement le code de l'instruction de requête :

PHP

$priority = Priority::select(['priorities.*', 'touch.name', 'touch.add_user'])
 ->rightJoin('touch', 'priorities.touch_id', '=', 'touch.id')
 ->where('priorities.type', 1)
 ->orderBy('priorities.total_score', 'desc')
 ->orderBy('touch.created_at', 'desc')
 ->get();
Copier après la connexion
Copier après la connexion

$priority = Priority::select(['priorities.*', 'touch.name', 'touch.add_user'])
 ->rightJoin('touch', 'priorities.touch_id', '=', 'touch.id')
 ->where('priorities.type', 1)
 ->orderBy('priorities.total_score', 'desc')
 ->orderBy('touch.created_at', 'desc')
 ->get();
Copier après la connexion
Copier après la connexion

Cela résout le problème. Ensuite, vous devriez y prêter attention à l'avenir. Il est préférable de spécifier les champs renvoyés lors de la jointure de deux tables dans Laravel.

Est-ce un bug de Laravel ? Si la valeur d'un champ est écrasée par une valeur de champ portant le même nom, une erreur doit-elle être signalée au lieu de poursuivre l'exécution par défaut ?

Quelqu'un sur github a également soulevé le même problème, et l'auteur a également fourni une solution, mais il n'y a pas d'autre meilleure solution.

Version Laravel : 5.3

Lien : https://github.com/laravel/framework/issues/4962

Ce qui précède est l'intégralité du contenu de cet article, je j'espère que cela sera utile à tout le monde. L'apprentissage aide.


Recommandations associées :

PHPTraitement de la vérification secondaire sur le serveur après l'achat intégré à l'application Apple (expérience du projet )

Injection manuelle DVWA de php+mysql

PHPCode d'analyse d'intégration de projet sur API de paiement WeChat (paiement national)

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal