针对hasMany-relation的超薄php / Eloquent自定义查询

时间:2017-03-31 00:26:06

标签: php sql eloquent slim

我目前正在使用Slim php-framework和eloquent-database: https://www.slimframework.com/docs/cookbook/database-eloquent.html

我想要做的是使用自定义SQL查询来设置两个模型的hasMany-relation。

让我们说,我有两个模型“用户”和“进入”。

我的User.php看起来像这样

class User extends \Illuminate\Database\Eloquent\Model {
    protected $table = 'users';

    public function entries() {
        return $this->hasMany('foo\bar\Entry');
    }

}

要获取条目,我使用以下代码按预期工作。

$userentries = User::find(1)->entries

但是,我希望使用自定义SQL查询(如

)获取条目
SELECT e.user_id, e.colB, SUM(e.colC - e.colD) as foobar from entries as e where e.user_id = 1 group by e.colB order by foobar DESC;

而不是默认的SELECT * from entries where user_id = 1;,但仍保持Entry模型与User的entries属性相关联。这可能吗?

2 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,您可以这样做:

$userentries = User::where('some', 'conditon')->with('entries')->get();

因此,您基本上只需在查询中添加with('entries')

答案 1 :(得分:0)

好吧,找到了一个干净的解决方案,它是selectRaw()和雄辩的本地范围的组合:https://laravel.com/docs/5.4/eloquent#local-scopes

原型:

我玩了查询() - 找出问题的函数,找到了可能的函数并提出了这个函数

Entry::query()->selectRaw("SUM(colC - colD) as foobar, colB")->where('user_id', 1)->groupBy('colB')->orderBy('foobar', 'DESC')->get();

在关系中使用它:

Entry.php模型如下所示:

class Entry extends \Illuminate\Database\Eloquent\Model {

    public function scopeCustom($query) {
        return $query->selectRaw("SUM(colC - colD) as foobar, colB")->groupBy('colB')->orderBy('foobar', 'DESC')->get();
    }
}

最后......

我可以用:

来调用它
User::find(1)->entries()->custom();