2017-04-05 43 views
0

我来accros与laravel的ORM的问题,雄辩,并没有找到解决办法。多个“有很多通过”与laravel的雄辩

我有一些表格如下

- id 
- name 

用户

- id 
- name 
- role 
- team_id 

Student_Info

- id 
- user_id 
- data1 
- data2 
- etc ... 

项目

- id 
- student_id 
- name 

现在,我要查询所有项目一定team,其中team = 'some team'

现在,这里的问题是,没有一个ORM,这很简单,我会做原始SQL中的多个连接。

然而,因为所有这些表都有一个共同的列“名”我将不得不别名这一切的东西,这实在是无聊

凭借雄辩我不能找到一种方法使用要做到这一点查询“有很多通过“,因为它只允许中间和我不能做一个原始的SQL,因为阿里斯事情真的是一个痛苦的屁股,因为它是非常困难的结果映射到laravel的模型

+0

也可以在项目表中使用team_id。 –

+0

好吧,这在数据库设计中是非常糟糕的做法,因为在事实中,项目并不直接属于项目,而是属于学生,因此它会造成重复并在模型的真实内容中造成混淆。 – darkylmnx

回答

0

尝试与关系存在。这假设你已经正确定义了所有关系

$projects = Project::whereHas('students.user.team', function ($query) { 
    $query->where('name', '=', 'some team'); 
})->get(); 

这是3层嵌套。从未测试过。但是,如果您已通过hasManyThrough()定义项目 - 用户关系,则只能将其缩短到2个级别。

$projects = Project::whereHas('user.team', function ($query) { 
    $query->where('name', '=', 'some team'); 
})->get(); 

那些只会给你项目的数据。如果您还想要中间数据,请使用热切加载而不是with()。只需用with()代替whereHas()即可。

$projects = Project::with('user.team', function ($query) { 
    $query->where('name', '=', 'some team'); 
})->get(); 
+0

我以前试过,但它确实在简单的查询上工作,但在复杂的过滤器和它没有的东西(和laravel组成的查询很漂亮......拉屎大声笑,但毕竟它是一个ORM,所以不能有性能+使用简单) – darkylmnx

+0

有趣。我可以做到吗?使用原始问题是否有可能通过project_id获得项目团队,并且项目是否已加载? –