繁体   English   中英

在laravel中获得*相关*链接模型,而不是原始SQL

[英]get *related* linked models in laravel eloquent instead of raw SQL

我试图通过查询一个名为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.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的Controller中。

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);
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM