【问题标题】:Laravel eager loading with where() from its relationLaravel 使用 where() 从它的关系中急切加载
【发布时间】:2022-03-24 19:53:31
【问题描述】:

我有 3 个有关系的表

预算表:

Field Type Null Key Default Extra
id bigint(20) unsigned NO PRI NULL auto_increment
user_id bigint(20) unsigned NO MUL NULL
purpose varchar(255) NO NULL
delivery_plan varchar(255) NO NULL
status varchar(255) NO NULL
created_at timestamp YES NULL
updated_at timestamp YES NULL

周期表:

Field Type Null Key Default Extra
id bigint(20) unsigned NO PRI NULL auto_increment
name varchar(255) NO NULL
term_id bigint(20) unsigned NO NULL
created_at timestamp YES NULL
updated_at timestamp YES NULL

术语表:

Field Type Null Key Default Extra
id bigint(20) unsigned NO PRI NULL auto_increment
name tinyint(4) NO NULL
status varchar(255) NO NULL
created_at timestamp YES NULL
updated_at timestamp YES NULL

预算模型:

public function period()
{
    return $this->belongsTo(Period::class, 'delivery_plan', 'name');
}

周期模型:

public function budgets()
{
    return $this->hasMany(Budget::class, 'delivery_plan', 'name');
}

public function term()
{
    return $this->belongsTo(Term::class);
}

术语模型:

public function periods()
{
    return $this->hasMany(Period::class);
}

所以每个预算都属于一个时期,而时期属于一个任期。 然后我想根据术语名称查询预算。 那么如何通过 laravel 预加载查询呢?

【问题讨论】:

    标签: laravel eloquent eloquent-relationship


    【解决方案1】:

    你使用 whereHas 方法:

    $builder->whereHas('relationName', function (Builder $builder){ /* your query */ });
    

    如果你没有任何条件可以申请,你可以直接使用whereHas而不需要回调

    如果需要,您可以链接多个 whereHas

    Budget::whereHas("period", function(Builder $builder) {
                $builder->whereHas('term', function(Builder $builder) {
                    $builder->where('name', '=', 'test');
                })
            })
    

    你甚至可以通过使用点符号来简化它

    Budget::whereHas("period.term", function(Builder $builder) {
                $builder->where('name', '=', 'test');
            })
    

    【讨论】:

    • 我用点表示法尝试了最短,这就是我想要的。非常感谢@Lk77!
    【解决方案2】:

    您只需使用hasManyThrough。因此,您可以通过Period 链接BudgetTerm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-12
      • 2021-11-29
      • 2019-11-05
      • 1970-01-01
      • 2021-12-01
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多