Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erklärung der Lösung für die Fehler-ID, die von einer Laravel-bezogenen Abfrage in PHP zurückgegeben wird

Detaillierte Erklärung der Lösung für die Fehler-ID, die von einer Laravel-bezogenen Abfrage in PHP zurückgegeben wird

墨辰丷
墨辰丷Original
2018-05-24 11:26:101633Durchsuche

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 关联查询返回错误的 id

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:

PHPVerarbeitung der sekundären Überprüfung auf dem Server nach dem Apple APP In-App-Kauf (Projekterfahrung). )

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn