Laravel - Eloquent在比较之前将查询参数转换为整数

Jen*_*ang 7 php laravel eloquent

我正在尝试根据主键从表中返回一行.

    $product = Product::where('id', '=', $idOrSKU)
        ->orWhere('sku', '=', $idOrSKU)
        ->take(1)->get();
Run Code Online (Sandbox Code Playgroud)

出于某种原因$idorSKU正在转换为(int)比较之前和之前.例如,当$isOrSKU = "9dfghfd"返回ID = 9的行时.为什么是这样?它应该什么都不返回!有人可以解释一下吗?

这是相关的表格方案

| id                         | int(10) unsigned | NO   | PRI | NULL      
| name                       | varchar(255)     | NO   |     | NULL                
| sku                        | varchar(255)     | NO   |     | NULL 
Run Code Online (Sandbox Code Playgroud)

Lau*_*nce 4

这与数据库有关,而不是 Laravel,对字符串进行类型转换。因为您正在对列进行查询int(10),所以 mySQL 会强制将您的搜索字符串更改为int,导致您的查询变为9

我可以确认以下几点:

$test1 = Test::find('1');
echo $test1->id; // gives 1

$test2 = Test::find('1example');
echo $test2->id; // gives 1
Run Code Online (Sandbox Code Playgroud)

因此你的变量9dfghfd因为类型转换为int (9). 但如果你的变量是“df9ghfd” - 它不会被类型转换,并且不会匹配。

编辑:该问题会影响其他事物,例如路由模型绑定:

domain.com/product/1

domain.com/product/1thisalsoworks // takes you to the page of ID 1
Run Code Online (Sandbox Code Playgroud)

我已经在 Github 上开了一张票以进一步讨论它- 所以请在此处查看更多信息/讨论。

但总的来说,这个问题并不是 Laravel 的直接错误。

编辑:似乎这个问题影响了 GitHub本身

这有效: https: //github.com/laravel/framework/issues/5254

这也是如此: https: //github.com/laravel/framework/issues/5254typecast