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