In diesem Artikel wird hauptsächlich die Lösung für die von Laravel zugeordnete Abfrage zurückgegeben. Es ist sehr gut und hat Referenzwert.
Verwenden Sie die verknüpfte Abfrage von Laravel. Wenn zwei Tabellen ein Feld mit demselben Namen haben, z. B. id, wird sein Wert standardmäßig durch ein späteres Feld mit demselben Namen überschrieben, und das zurückgegebene Ergebnis ist nicht erwartet. Zum Beispiel die folgende verwandte Abfrage:
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();
Sowohl die Prioritäts- als auch die Touch-Tabelle haben ID-Felder. Wenn die Abfrage wie folgt aufgebaut ist, lauten die zurückgegebenen Abfrageergebnisse wie folgt:
Laravel-Korrelationsabfrage gibt die falsche ID zurück
Der Wert von id ist hier nicht das ID-Feld der Prioritätentabelle, sondern das ID-Feld der Touch-Tabelle. Wenn die ausgeführte SQL-Anweisung ausgedruckt wird:
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
Das Abfrageergebnis ist wie in der Abbildung dargestellt:
Das Ergebnis der Verwendung einer SQL-Abfrage ist tatsächlich korrekt. Außerdem heißt das ID-Feld einer Tabelle mit demselben Namen standardmäßig id1, aber der von Laravel zurückgegebene ID-Wert ist nicht das ID-Feld in der Abbildung, sondern hat wurde durch das Feld einer anderen Tabelle mit demselben Namen überschrieben.
Die Lösung besteht darin, eine Auswahlmethode hinzuzufügen, um das Feld anzugeben und den Abfrageanweisungscode korrekt zu erstellen:
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();
Das löst das Problem. Dann solltest du in Zukunft darauf achten, welche Felder beim Zusammenführen zweier Tabellen in Laravel zurückgegeben werden.
Ist das ein Laravel-Fehler? Wenn der Wert eines Felds durch einen Feldwert mit demselben Namen überschrieben wird, sollte dann ein Fehler gemeldet werden, anstatt die Ausführung standardmäßig fortzusetzen?
Jemand auf Github hat das gleiche Problem ebenfalls angesprochen, und der Autor hat auch eine Lösung bereitgestellt, aber es gibt keine andere bessere Lösung.
Laravel-Version: 5.3
Link: https://github.com/laravel/framework/issues/4962
Das Obige ist der gesamte Inhalt dieses Artikels, I Ich hoffe, es wird für alle hilfreich sein. Lernen hilft.
Verwandte Empfehlungen:
DVWA manuelle Injektion von PHP+MySQL
PHPProjektintegrations-Scancode aktiviert WeChat Payment API (Inlandszahlung)
Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung der Lösung für die Fehler-ID, die von einer Laravel-bezogenen Abfrage in PHP zurückgegeben wird. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!