【问题标题】:Laravel limit with (not globally)Laravel 限制(非全局)
【发布时间】:2014-12-24 03:06:37
【问题描述】:

我想用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 模型中,但是对于每个查询(以数组/ json 形式),它们将被隐藏。但我只想对这个查询进行更多限制。

如果我添加选择(无论是否将其包装在数组中),我都会得到以下结果:

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

但是,如果我删除该选择,我会得到完整的 User

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

User 确实存在,username 不为空。我该怎么办?

在这里可以找到actual 输出。

编辑:当我将选择中的值更改为数据库中不存在的值时,我看到一个错误,并从中推断出查询是正确的,但我只是没有得到任何输出。 (使用无效列“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)

【问题讨论】:

标签: php laravel eloquent


【解决方案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 关系是否可能。您还应该考虑到这可能有点危险(可能会出现一些问题),因此只有在您有充分的理由抓住选定的列时才应该使用它。

【讨论】:

  • 这似乎没有什么区别。 (在 TS 中添加了我的回复的 Json 要点)。
猜你喜欢
  • 2022-08-19
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
  • 2019-11-05
  • 2017-12-12
  • 2020-11-20
相关资源
最近更新 更多