Laravel 4 Eager加载过滤并仅选择匹配的结果

时间:2013-09-04 13:56:11

标签: mysql laravel laravel-4 eloquent

我试图仅使用匹配的元素输出过滤结果。

我有两个表(在实际项目中,将是5个),让我们说companiesprojects。公司可能有多个项目,也可能没有。

这些是关系:

/app/models/Company.php

<?php

class Company extends Eloquent {

    public function projects() {
        return $this->hasMany('Project','companyID');
    }

    protected $table = 'companies';


}

/app/models/Project.php

<?php

class Project extends Eloquent {

    public function companies() {
        return $this->belongsTo('Company','companyID');
    }

}

我想要做的是,我希望得到它们的结果,但只能使用匹配的参数。

我试过这个:

return Company::with(array('projects'=>function($query){
    $query->where('id',99); //project's id is 99
}))->get();

This is the output JSON

如果我将值从99更改为1(product.id为1的结果),则会更改为this

我只想从我发布的第二个JSON获得第二个结果

正如您在第二个JSON中看到的那样(我使用this parser进行检查),无论项目如何,所有公司都会加载,只有匹配的行才有对象projects

我们会有更多的&#39;并且我不知道如何只过滤匹配的元素。

我也尝试了having()封闭内容,但它仍然相同:

$query->having('projects.id','=',99);

有没有办法只过滤匹配结果(不使用循环),输出只包含具有匹配项目对象的结果?

编辑:实际上,我们会过滤5个表格。

companiesprojectsworksusersuser_works

让我们说; &#34;公司&#34;有很多项目。 &#34;项目&#34;有很多作品 &#34;工程&#34;有很多用户,也有#34;用户&#34;可能有多个工作(数据透视表user_works)。

所有关系都是从模型中正确设置的。

我想对这些进行全局搜索。

类似于:&#34;带给我用户ID 1的公司ID为5且项目ID为4&#34;的作品,但没有一个字段是强制性的。 所以这些也适用于搜索:&#34;带给我每个人的项目ID为2&#34;或者#34;带给我id 2&#39;或者# 34;把我今天开始的所有作品带到#34;,&#34;带上我在项目2&#34;上的作品1,&#34;带给我今年的作品公司ID 1&#34;。

提前致谢

2 个答案:

答案 0 :(得分:1)

使用whereHas()是我案例的解决方案。它过滤关系并影响主查询中返回的结果。

答案 1 :(得分:0)

如果您拥有项目的ID,那么走这条路会更有意义吗? $project = Project::find(99);然后可以使用$project->companies->name;

访问公司变量

companies()函数重命名为company()会更有意义,因为项目只属于一个项目。