ホームページ  >  記事  >  バックエンド開発  >  PHPのLaravel関連クエリによって返されるエラーIDの解決策の詳細な説明

PHPのLaravel関連クエリによって返されるエラーIDの解決策の詳細な説明

墨辰丷
墨辰丷オリジナル
2018-05-24 11:26:101633ブラウズ

この記事では、Laravel の関連クエリによって返されるエラー ID の解決策を主に紹介します。これは非常に優れており、必要な場合は参照してください。

2 つのテーブルにid などの同じ名前のフィールドを指定した場合、その値はデフォルトで同じ名前の後続のフィールドによって上書きされ、予期しない結果が返されます。たとえば、次の関連クエリ:

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

クエリが次のように構築されている場合、返されるクエリ結果は次のとおりです。 :

Laravel 关联查询返回错误的 id

Laravel 関連のクエリが間違った ID を返します

ここでの ID の値は、優先順位テーブルの ID フィールドではなく、実行された SQL ステートメントが出力される場合:

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

クエリの結果は次の図に示されています:

SQL クエリを使用した結果は、実際には正しいです。別のテーブルにある同じ名前の ID フィールドの名前は、id1 です。デフォルトですが、Laravel によって返される ID 値は図に示されているものとは異なります。ID フィールドは、同じ名前の別のテーブルのフィールドによって上書きされています。

解決策は、フィールドを指定する選択メソッドを追加し、クエリ ステートメント コードを正しく構築することです:

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

これで問題は解決します。その後、Laravel に注意を払う必要があります。将来的には 2 つ テーブルを結合するときに返されるフィールドを指定することをお勧めします。

これはLaravelのバグですか?フィールドの値が同じ名前のフィールド値で上書きされた場合、デフォルトで実行を続行する代わりにエラーを報告する必要がありますか?

github 上でも同じ問題を提起した人がいて、作者も解決策を提供しましたが、これより良い解決策はありません。

Laravel バージョン: 5.3

リンク: https://github.com/laravel/framework/issues/4962

上記がこの記事の全内容です、皆さんの学習に役立つことを願っています。


関連する推奨事項:

PHPApple APPのアプリ内購入後のサーバーへの二次検証の処理(プロジェクトエクスペリエンス)

DVWA php+mysqlの手動インジェクション

PHP このプロジェクトは、WeChat QR コード スキャン決済 API (国内決済) を統合します

以上がPHPのLaravel関連クエリによって返されるエラーIDの解決策の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。