我试图仅使用匹配的元素输出过滤结果。
我有两个表(在实际项目中,将是5个),让我们说companies
和projects
。公司可能有多个项目,也可能没有。
这些是关系:
/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();
如果我将值从99
更改为1
(product.id为1的结果),则会更改为this:
我只想从我发布的第二个JSON获得第二个结果。
正如您在第二个JSON中看到的那样(我使用this parser进行检查),无论项目如何,所有公司都会加载,只有匹配的行才有对象projects
。
我们会有更多的&#39;并且我不知道如何只过滤匹配的元素。
我也尝试了having()
封闭内容,但它仍然相同:
$query->having('projects.id','=',99);
有没有办法只过滤匹配结果(不使用循环),输出只包含具有匹配项目对象的结果?
编辑:实际上,我们会过滤5个表格。
companies
,projects
,works
,users
和user_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;。
提前致谢
答案 0 :(得分:1)
使用whereHas()
是我案例的解决方案。它过滤关系并影响主查询中返回的结果。
答案 1 :(得分:0)
如果您拥有项目的ID,那么走这条路会更有意义吗? $project = Project::find(99);
然后可以使用$project->companies->name;
将companies()
函数重命名为company()
会更有意义,因为项目只属于一个项目。