我在用户和角色之间有多对多的关系。出于某种奇怪的原因,当我执行User::find(1)->roles->contains(2)
它将无法工作时,总是抛出false
(我已经检查了数据库,而且ID为1的用户具有id为2的角色)。
我正在使用它作为Laravel文档:http://laravel.com/docs/5.0/eloquent#collections
我挖掘了contains()
方法并在Illuminate\Database\Eloquent\Collecion.php
中找到了它,这里是:
/**
* Determine if a key exists in the collection.
*
* @param mixed $key
* @param mixed $value
* @return bool
*/
public function contains($key, $value = null)
{
if (func_num_args() == 1 && ! $key instanceof Closure)
{
$key = $key instanceof Model ? $key->getKey() : $key;
return $this->filter(function($m) use ($key)
{
return $m->getKey() === $key;
})->count() > 0;
}
elseif (func_num_args() == 2)
{
return $this->where($key, $value)->count() > 0;
}
return parent::contains($key);
}
正好在方法的中间,如果我为return $m->getKey() === $key;
更改==
,它会突然发挥作用。这是拼写错误吗?我应该在存储库中报告它还是发出拉取请求?
P.S。它永远不会进入parent::contains()
,或者至少在我的情况下。
答案 0 :(得分:1)
可能是因为您的PHP中安装了错误的MySQL插件。有两个版本:mysqlnd
和libmysql
。第二个用于给我带来太多麻烦,因为它将数据库中的数据作为字符串返回,即使该值是实际整数。 mysqlnd
正确地将值返回为整数,因此如果您使用$model->id === 2
它将正常工作,而libmysql
它将评估为false,因为它是严格检查,$model->id
将成为string '2'
。所以我会检查你的代码。尝试转储您的一个角色ID并检查它是否为整数或字符串。