【问题标题】:About Eager Loading with select filter in Laravel Eloquent Model关于在 Laravel Eloquent 模型中使用选择过滤器进行 Eager Loading
【发布时间】:2018-08-03 08:10:57
【问题描述】:

我定义了一个关系

class people {
    public function hobbies() {
        return $this->hasMany(hobby::class, "people_id")->select(['name', 'action', 'effect']);
    }
}

我尝试通过急切加载来加载

people::with('hobbies')->get();

最终我的hobbies 的结果总是空的,然后我发现这是因为选择过滤器在peoplehobbies 的关系中没有people_id 喜欢

public function hobbies() {
        return $this->hasMany(hobby::class, "people_id")->select(['people_id', 'name', 'action', 'effect']);
    }

那我现在有个问题,为什么select过滤器需要外键?

对于一个sql查询,select hobbies.name, hobbies.action, hobbies.effect from hobbies join people on hobbies.people _id = people.id就足够取回数据了?

【问题讨论】:

  • 你可能想从你的模型中删除 select() 并这样做以使CDE::with('ABC:id,foo,bar')->get(); 更有活力,甚至像这样CDE::with(['ABC', function($query) { $query->select('id', 'foo', 'bar', 'created_at', 'whatever'); }])->get();
  • 您应该始终在关系模型中选择 relations key 列。如果你不选择那么雄辩的找不到相关行。
  • 如果您将ABC, CDE 替换为您的实际model 名称会更好。人们会更容易为您提供帮助。
  • @اسماعیلزارع,不,因为它是来自人们的加入,我已经与 people.id 对吗?只是更容易从 hobbies.people_id 访问,可以直接从 people.id 分配 hobbies_people_id。在人模型中,我使用get(),所以人模型中的所有数据都被检索到,对于人模型关系模型,当外键为空时,可以从人那里检查并抓取它吗?
  • @AH.Pooladvand 我使用 select 的原因,只是为了从数据库中检索较小的字段。而对于你写的第二种方法CDE::with(['ABC', function($query) { $query->select('id', 'foo', 'bar', 'created_at', 'whatever'); }])->get();,我不确定这种方式,当记录为25时,它会查询26次,因为预加载的建议是最小化从26到2的过程。

标签: php sql laravel eloquent eager-loading


【解决方案1】:

预加载查询实际上是这样的:

select `people_id`, `name`, `action`, `effect`
from `hobbies`
where `people_id` in (1, 2, 3, ...)

如果你从 SELECT 列中删除 people_id,Laravel 不知道这些爱好属于哪些人。

【讨论】:

  • $this->hasMany(hobby::class, "people_id") 中,laravel 已经知道我使用people_id 作为外键,所以在选择时不需要它。
  • 这不是它的工作原理。急切加载的全部意义在于在一个查询中获得所有人的爱好。然后 Laravel 通过查看 people_id 值将它们分配给合适的人。没有它是不可能的。
猜你喜欢
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
  • 2014-07-18
  • 2017-06-28
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
相关资源
最近更新 更多