Laravel - Eloquentは、クエリパラメータを比較前に整数に変換します

StackOverflow https://stackoverflow.com//questions/25008004

  •  20-12-2019
  •  | 
  •  

質問

主キーに基づいてテーブルから単一行を返しようとしています。

    $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();
});
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top