Maison  >  Article  >  développement back-end  >  Explication détaillée de la solution à l'identifiant d'erreur renvoyé par la requête associée à Laravel en PHP

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

墨辰丷
墨辰丷original
2018-05-24 11:26:101615parcourir

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

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

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

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

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

$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();

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!

Déclaration:
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