Laravel限制(不是全球)

时间:2014-10-28 16:00:22

标签: php laravel eloquent

我想要使用Eloquent执行以下查询。

$restaurant = Restaurant::with([
    'user' => function($query)
    {
        $query->select(['username']); // This doesn't work
        $query->whereStatus('confirmed');
    }
])->find($id);

我想要获取Restaurant并且它是相应的User(它们是相关的),但是从User我不是所有的信息。在这种情况下只有username

我可以向$hidden模型添加属性User,但是对于每个查询都会隐藏它们(以array / json形式)。但我只想为此查询限制一点。

如果我添加select(有或没有将它包装在一个数组中),我得到以下结果:

{
    'id': 1,
    'user': null
}

然而,如果我删除该选项,我会得到完整的User

{
    'id': 1,
    'user': { .. json user data }
}

User确实存在且username不为空。我怎么能这样做呢?

此处可以找到actual输出。

编辑:当我将select中的值更改为数据库中不存在的内容时,我看到一个错误,从中我推断出Query是正确的,但我只是没有得到任何输出。 (使用无效列'test'时得到的查询。)

select `test` from `users` where `users`.`deleted_at` is null and `users`.`userable_id` in (1) and `users`.`userable_type` = Restaurant and `status` = confirmed)

1 个答案:

答案 0 :(得分:1)

尝试这种方式:

$restaurant = Restaurant::with([
    'user' => function($query)
    {
        $query->whereStatus('confirmed')->lists('username');
    }
])->find($id);

修改

似乎两种方法都可以工作,但您需要满足一个条件 - 您需要在列表/选择中包含foreign_key列。我不知道您的关系是什么,但例如假设您在usersrestaurant_id列中,则需要使用以下代码:

$restaurant = Restaurant::with([
    'user' => function($query)
    {
        $query->select(['username', 'restaurant_id'])->whereStatus('confirmed');
    }
])->find($id);

$restaurant = Restaurant::with([
    'user' => function($query)
    {
        $query->whereStatus('confirmed')->lists('username','restaurant_id');
    }
])->find($id);

我不知道n:n关系是否可能。您还应该考虑这可能有点危险(可能会出现一些问题)所以只有在您有充分理由抓住所选列时才应该使用它。