【问题标题】:Laravel 4 Eager Loading filtering and selecting only matching resultsLaravel 4 Eager Loading 过滤并仅选择匹配的结果
【发布时间】:2013-09-04 13:56:10
【问题描述】:

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

我有两个表(在实际项目中,这将是 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(products.id 为1 的结果),它会更改为this

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

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

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

我也试过 having() 在闭包里,但还是一样:

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

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

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

companiesprojectsworksusersuser_works

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

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

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

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

提前致谢

【问题讨论】:

    标签: mysql laravel laravel-4 eloquent


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 能否请您查看从here 开始的讨论?它比看起来更复杂(实际上有 4 个表相关)。
      猜你喜欢
      • 2018-01-10
      • 2017-05-23
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 2018-08-03
      • 2017-08-27
      • 2013-06-04
      • 1970-01-01
      相关资源
      最近更新 更多