我正在使用Laravel 5.1。 我做了我的路线规则。 “/后/(编号)” 并且帖子将返回此代码。
Post::find($id);
呀!有用。
但我只是想知道它是否适用于非数字。 (例如:1dssadf
)所以我激动了代码。
Post::find('1dssadf');
(有一个帖子ID 1)
我除了错误。但它的确有效。它找到了帖子ID 1.(忽略dssadf
)
为什么'1dssadf'被视为'1'?
答案 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(..)
。