Laravel包含方法无法正常工作

时间:2015-03-20 13:29:40

标签: php laravel eloquent laravel-5

我在用户和角色之间有多对多的关系。出于某种奇怪的原因,当我执行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(),或者至少在我的情况下。

1 个答案:

答案 0 :(得分:1)

可能是因为您的PHP中安装了错误的MySQL插件。有两个版本:mysqlndlibmysql。第二个用于给我带来太多麻烦,因为它将数据库中的数据作为字符串返回,即使该值是实际整数。 mysqlnd正确地将值返回为整数,因此如果您使用$model->id === 2它将正常工作,而libmysql它将评估为false,因为它是严格检查,$model->id将成为string '2'。所以我会检查你的代码。尝试转储您的一个角色ID并检查它是否为整数或字符串。