1

我正在尝试仅输出匹配元素的过滤器结果。

我有两个表(在实际项目中,这将是 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();

这是输出 JSON

如果我将值从更改991(有 products.id 为 1 的结果),它将更改

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

正如您在第二个 JSON 中看到的(我正在使用此解析器进行检查),无论项目如何,所有公司都已加载,并且只有匹配的行具有 object projects

会有更多的'with',我不知道如何只过滤匹配的元素。

我也尝试过having()封闭,但它仍然是一样的:

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

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

编辑:实际上,将过滤 5 个表。

companies, projects,和works_usersuser_works

比方说;“公司”有很多项目。“项目”有很多作品“作品”有很多用户,“用户”可能有多个作品(数据透视表 user_works)。

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

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

类似于:“给我带来用户 id 1 的作品,其公司 id 为 5,项目 id 为 4”,但没有一个字段是强制性的。所以这些也适用于搜索:“给我带来每个id为2的项目的作品”,或“给我带来id为2的作品”,或“给我带来从今天开始的所有作品”,“给我带来id为1的项目作品” 2", "给我带来公司 id 1 今年完成的工作".

提前致谢

4

2 回答 2

1

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

于 2014-06-13T13:45:50.537 回答
0

如果您有项目的 id,那么走这条路是否更有意义? $project = Project::find(99);然后可以使用公司变量访问$project->companies->name;

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

于 2013-09-04T16:03:08.853 回答