0

我试图通过查询名为 company_projects 的链接表来获取“相关”链接模型,该链接表包含(如您所料)公司和项目的 id(项目是一种产品类别)。

在这种情况下,用于确定相关项目的流程是:

  1. 获取与您在同一项目(“产品类别”)中的公司
  2. 查找与这些公司相关联的其他项目 ID
  3. 获取上一步获取的链接项目的信息


我正在尝试做的已经在以下原始查询中起作用:

SELECT
     *
FROM 
     projects
WHERE 
    projects.id IN 
    (
        SELECT cp1.project_id
        FROM company_projects cp1
        WHERE cp1.company_id IN 
        (
            SELECT cp1.company_id
            FROM projects p
            LEFT JOIN company_projects cp2 ON cp2.project_id = p.id
            WHERE p.id = X AND cp2.company_id != Y
        )
    ) 
    AND projects.id != X

X = 当前项目的 ID(“产品类别”)
Y = 当前“用户”(公司)的 ID


但我真正的问题是,如何在 Laravel Eloquent(当前为 v4.2)中优雅地做到这一点。我试过了,但到目前为止我没有运气......

更新:
我应该注意,我确实有通过多个项目使用 Eloquent 和 Models 的经验,但由于某种原因,我在这个特定的查询中失败了。所以希望看到一个解释的解决方案。我可能以错误的方式思考并且答案相对容易。

4

1 回答 1

1

您将需要利用Eloquent 关系来实现这一点。(请注意,我正在链接到 4.2 文档,因为这是您正在使用的文档,但我强烈建议将 Laravel 升级到 5.1)

我假设您已经有一个“公司”和“项目”模型。在每个模型中,您需要定义一个方法来引用它与另一个模型的关系。根据你的描述,听起来两者是多对多的关系,也就是说一个公司可以有很多项目,一个项目也可以属于很多公司。您已经有一个链接两者的数据库表。在 Eloquent ORM 中,这个链接表称为数据透视表。在模型中定义关系时,您需要将该数据透视表的名称作为第二个参数传递。这是它可以为您寻找的方式。

公司型号:

class Company extends Model
{
    /**
     * Get the projects attached to a Comapny. Many To Many relationship.
     */
    public function projects()
    {
        return $this->belongsToMany('Project','company_projects');
    }
}

项目型号:

class Project extends Model
{
    /**
     * Get the companies this project belongs to. Many To Many relationship.
     */
    public function companies()
    {
        return $this->belongsToMany('Company','company_projects');
    }
}

如果您的模型定义了这些关系,那么您可以轻松地在您的视图和其他地方引用它们。例如,如果您想查找属于 ID 为 1234 的公司的所有项目,您可以这样做:

$company = Company::find(1234);
$projects = $company->projects;

更好的是,您可以使用一种称为eager loading的东西,这会将您的数据查找减少到一行(这主要在将数据传递给视图时很有用,您将在视图中循环访问相关模型)。所以上面的那些语句可以重写为:

$company = Company::with('projects')->find(123);

这将返回您的公司模型及其所有相关产品作为属性。请注意,急切加载甚至可以用点表示法嵌套。这意味着您可以找到链接到主模型的所有模型,然后找到这些模型的所有模型,依此类推。

考虑到所有这些,让我们看看您具体想要完成什么。

让我们假设这个方法发生在一个控制器中,控制器从路由中传递了一个项目 id。

public function showCompaniesAndProjects($id)
{
    //Get all companies in the same project as you
    //Use eager loading to grab the projects of all THOSE companies
    //Result will be a Project Object with all Companies 
    //(and those projects) as Eloquent Collection
    $companies = Project::with('companies.projects')->find($id);

    //do something with that data, maybe pass it to a view
    return view('companiesView')->with('companies',$companies);
}

在模型中定义关系后,您可以在一行中完成整个查询。

于 2015-10-20T19:38:57.780 回答