laravel mysql忽略数字后的字母

时间:2015-11-03 12:00:33

标签: php mysql laravel laravel-5.1

我正在使用Laravel 5.1。 我做了我的路线规则。 “/后/(编号)” 并且帖子将返回此代码。

Post::find($id);

呀!有用。

但我只是想知道它是否适用于非数字。 (例如:1dssadf)所以我激动了代码。

Post::find('1dssadf');

(有一个帖子ID 1)

我除了错误。但它的确有效。它找到了帖子ID 1.(忽略dssadf

为什么'1dssadf'被视为'1'?

2 个答案:

答案 0 :(得分:4)

这是一个id,所以它被转换为相关的内容。

您可以使用

进行测试
echo (int) "1dssadf";

=> 1

MySQL等价物:

SELECT CAST( '1dssadf' AS UNSIGNED ) 

=> 1

答案 1 :(得分:1)

思考,接受的答案是"不完整"。显然转换发生 - 如果它起作用并返回一些结果。实际上,Eloquent并没有将传递的值从string转换为int。您可以在\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Builder.php下一步看到:

/**
 * Find a model by its primary key.
 *
 * @param  mixed  $id
 * @param  array  $columns
 * @return \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection|null
 */
public function find($id, $columns = ['*'])
{
    if (is_array($id)) {
        return $this->findMany($id, $columns);
    }

    $this->query->where($this->model->getQualifiedKeyName(), '=', $id);
    return $this->first($columns);
}

Builder只是添加where-condition和当前主键的名称。然后它(构建器)编译所有参数/条件/等。准备好的陈述和除外。在您的情况下,select * from posts where posts.id = ? limit 1$bindings数组[0 => "1dssadf"]一致。您可以在\vendor\laravel\framework\src\Illuminate\Database\Connection.php(方法select)看到这一刻。最后,答案是MySQL认识到id应该是一个整数(INT),并自动转换字符串" 1dssadf"到整数1(内置行为),没有任何(int)...CAST(..)