[英]get *related* linked models in laravel eloquent instead of raw SQL
我试图通过查询一个名为company_projects的链接表来获取“相关”链接模型,该链接表包含(和您期望的一样)公司和项目的ID(项目属于产品类别)。
在这种情况下,用于确定相关项目的流程为:
我正在尝试做的事情已经在以下原始查询中起作用:
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.