Laravel - Eloquentは、クエリパラメータを比較前に整数に変換します
質問
主キーに基づいてテーブルから単一行を返しようとしています。
$product = Product::where('id', '=', $idOrSKU)
->orWhere('sku', '=', $idOrSKU)
->take(1)->get();
.
何らかの理由で、比較が発生する前に$idorSKU
が(int)
に変換されています。たとえば、$isOrSKU = "9dfghfd"
の場合、ID= 9の行が返されます。どうしてこれなの?それはまったく何も返すべきです!誰かがこれを説明できますか?
これは関連テーブルスキーム
です。| id | int(10) unsigned | NO | PRI | NULL
| name | varchar(255) | NO | | NULL
| sku | varchar(255) | NO | | NULL
. 解決
これはデータベースに関連しており、Laravelはあなたの文字列を調べます。 int(10)
列でクエリを実行しているため、MySQLはSearch Stringをint
に強制的に変更して、クエリを9
にすることができます。
次のことを確認できます。
$test1 = Test::find('1');
echo $test1->id; // gives 1
$test2 = Test::find('1example');
echo $test2->id; // gives 1
.
したがって、9dfghfd
からTypeCastecastのため、しかし、あなたの変数が "df9ghfd"であった場合、それはタイプキャストされず、それが一致しません。
編集:ルートモデルのバインディングのように、問題は他のものに影響します。
domain.com/product/1
domain.com/product/1thisalsoworks // takes you to the page of ID 1
.
GitHubでチケットをさらに議論してさらに議論します - こちらさらなる情報/ディスカッションのために。
しかし全体的な問題はLaravelの直接的な欠陥ではありません。
編集:問題がgithub 自体に影響を与えるようです:
この作品: https://github.com/laravel/framework/issues/52542 a>
これは: https://github.com/laravel/framework/issues/5254TypeCast
他のヒント
は、PostgreSQLを使用して、データベースとは異なる動作をしていることがわかります。
Route::any('test', function()
{
$code = '181rerum';
return Ad::where('id', $code)->orWhere('company_code', $code)->first();
});
.
このエラーを得ます:
SQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input
syntax for integer: "181rerum" (SQL: select * from "ads" where
"id" = 181rerum or "company_code" = 181rerum limit 1)
.
だからララベラは整数列であることを知っていますが、PostgreSQLはその文字列を整数にキャストしようとしないため、データベース例外を生成する引用符を直接データベースに渡します。
だから、あなたがLARVERの中核の開発者から何らかの助けを受けるたとえ私はあなたが常にあなたがあなたが常にあなたがあなたがそれらの混合命をするのを助けるべき何かをするべきだと思います:
Route::any('test/{id}', function($id)
{
/// You can always filter by a string here
$q = Ad::where('company_code', $id);
/// You just try to filter by id if the search string is entirely numeric
if (is_numeric($id))
{
$q->orWhere('id', $id);
}
return $q->first();
});
.