如何在 Laravel 雄辩关系中添加多个条件

Posted

技术标签:

【中文标题】如何在 Laravel 雄辩关系中添加多个条件【英文标题】:How to add multiple conditions on Laravel elequent relationship 【发布时间】:2017-11-01 11:32:44 【问题描述】:

我是 Laravel 的新手,正在开发 5.4 版本。我有一个模型“A”和模型“B”。模型 A 与 B 有很多关系。到目前为止一切正常。但现在,我想为这种关系添加更多条件。

默认情况下,Laravel 只处理外键关系。我的意思是它仅根据 1 个条件匹配数据。在这里,我想要更多的条件。

下面是两个模型的表格:

表:一个

id      name      Year  
 1      ABC       2016  
 2      DEF       2017  

表:B

 id     A_id     name   Year  
  1       1      tst    2016  
  2       2      fdf    2017  
  3       1      kjg    2017  

默认情况下,如果我想从表 B 中查看 A_id 1 的记录,那么 Laravel 将获取 A_id 1 的所有记录。但是现在,假设我想获取 2016 年的记录,那么我该如何使用Laravel 关系方法?

以下是两个表的 Elequent 模型:

class A extends Model  

    public function b()  
       return this->hasMany('B');  
      
  


class B extends Model  
     public function a()  
       return $this->belongsTo('A');  
     
  

Code to fetch records of id 1:  

$data = A::with('b')->find(1)->toArray();  

上述请求为我提供了表 B 中 id 1 的所有数据,但我也想输入相应的年份条件。

有谁知道,我可以这样做吗?请分享您的解决方案。

谢谢

【问题讨论】:

【参考方案1】:

您必须限制您的急切加载,使用数组作为with() 的参数,使用关系名称作为键,并使用闭包作为值:

$data = A::with([
    'b' => function ($query) 
        $query->where('year', '=', '2016');
    ,
])->find(1)->toArray();

闭包会自动注入一个查询构建器的实例,它允许您过滤急切加载的模型。

官方文档中对应部分:https://laravel.com/docs/5.4/eloquent-relationships#constraining-eager-loads

【讨论】:

你的回答证明,通读文档是件好事…… 这也很有帮助,我已经使用 Laravel 2 年多了。 :) 是的,文档是大多数基本问题的最佳来源。 老兄,我已经知道这个解决方案了。但我想让它通用。假设,我想获取所有 A 记录,那么每个 A 记录应该只有那些属于相应 A id 以及匹配相应年份的 B 记录。 嗯,您可以通过将 where 子句替换为范围来节省一些字符,但没有比这更通用的了。

以上是关于如何在 Laravel 雄辩关系中添加多个条件的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:如何设置带有条件的自定义列?

如何在 laravel 雄辩的关系中使用 where 子句

Laravel 5.6 |雄辩的一对多关系

Laravel 雄辩模型如何从关系表中获取数据

laravel 雄辩的多个表 where 条件

Laravel 雄辩的查询与条件下另一个表中的值的总和