【问题标题】:eager load non direct relation laravel急切加载非直接关系laravel
【发布时间】:2021-07-06 07:28:50
【问题描述】:

假设我们有用户属于许多课程。当然属于一类。用户将被分配到一个类别的少数课程,因此他将间接拥有一个类别。 所以我们可以像这样编码 $user ->find(1)->with('courses') $user->category= $user->courses->first()->category

让用户拥有课程和类别

急切加载是否有可能有类似的东西 $user->find(1)->with('category', 'courses')?

也可以用'with'子句替换发送到闭包的查询。 ?

【问题讨论】:

    标签: laravel eager-loading


    【解决方案1】:

    find 将返回单个模型,因此在这种情况下,急切加载和延迟加载对于直接关系都是等效的。对于嵌套关系,您仍然可以从预先加载中受益,因为只需执行一次查询即可加载每个加载的课程的类别。

    您可以获得如下嵌套关系:

    $user = User::with([ 'courses', 'courses.category' ])->find(1);
    // These will be pre-loaded
    // $user->courses
    // $user->courses[0]->category
    

    【讨论】:

    • 确定这是直接情况,但这确实解决了问题。
    • @AhmedBahtity 设置约束的方式 无法指定用户将拥有单一类别的课程,因为每个课程都可以属于不同的类别,并且没有可以对防止这种情况发生。
    • 这正是问题的关注点。框架允许吗?在框架下将查询分成两个。就像select from users ... 然后select from categories where id in [id of the selected users]。问题是没有办法控制 id 部分如何进入查询。您可以添加它们。
    • 我不确定我是否理解。当您执行User::with('categories')->where(condition) 时,这将执行类似SELECT * FROM users WHERE (condition) 的查询,然后执行select from categories where id in (ids retrieved from previous query) 您是否需要从那里删除ID?我认为如果你分享你的数据结构和约束会很有用
    • 我需要接收这些 IDS 并亲自操作它们
    猜你喜欢
    • 2017-04-12
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 2021-04-28
    • 2021-11-29
    相关资源
    最近更新 更多