【发布时间】:2014-04-08 14:35:22
【问题描述】:
我已经尝试了一段时间来弄清楚如何使用 Laravel Eloquent 进行此查询。
查询:
DB::select('SELECT
n.id,
n.parent_id,
n.name,
n.file,
n.created_at AS ts,
f.mime,
f.extension,
IF(ch.id, 1, 0) AS dirs
FROM nodes AS n
LEFT JOIN nodes AS ch ON ch.parent_id=n.id
LEFT JOIN files AS f
ON n.file = f.id
WHERE n.parent_id=?
GROUP BY n.id',array($path));
我有我的模型Node,它正在使用表nodes,我有一个方法nodefile() 用于我的Node 模型,包括return $this->belongsTo('NodeFile');,这是我需要加入的另一个模块。 NodeFile 模块正在使用表 files 并且这两个绑定在 nodes.file 和 files.id 上。
这是我目前得到的:
Node::with(
array('nodefile'=>function($query){
$query->select('mime','extension');
})
)->where('name','LIKE','%'.$q.'%')->get(array(
'id', 'parent_id', 'name', 'file', 'created_at AS nts'
));
但我的查询中仍然需要IF(ch.id,1,0) AS dirs。并且还没有完成自我加入。
有人知道如何以最好的方式做到这一点吗?
【问题讨论】:
-
为什么不能将它保存在原始查询()中? ORM 的发明是为了简化事情,而不是让你把头撞到桌子上。什么可以被 ORMified - 好的,通过 Eloquent 实现。但是有些查询并不打算使用 ORMS 运行。所以,那就不要折磨他们了
-
你可以做一个
$query->select(DB::raw(...)) -
你没有提供足够的关于你的关系的信息,实际上对
IF(ch.id, 1, 0) AS dirs感到困惑,所以不禁你可以检查this article,它是关于使用Eloquent关系技术的自我加入. -
@YourCommonSense,因为我想使用 Eloquent SoftDelete
-
您可以添加单独的“原始”选择列,这不会对软删除产生不利影响