Laravel 5.2使用可重用方法扩展Eloquent Builder

时间:2016-04-08 08:16:50

标签: laravel laravel-5 laravel-5.2

我在几个地方使用这样的逻辑来检索用户及其个人资料:

User::whereNotIn('id', $ids)
    ->select(['id', 'email'])
    ->with([
        'profile' => function ($query) {
            $query->addSelect(['id', 'user_id', 'first_name', 'last_name']);
        },
    ])->get();

我希望将其中的某些部分转换为可重复使用的链接方法:

User::whereNotIn('id', $ids)
    ->select(['id', 'email'])
    ->withSimpleProfile() // use default columns
    ->get();

和/或

User::whereNotIn('id', $ids)
    ->select(['id', 'email'])
    ->withSimpleProfile(['id', 'user_id', 'first_name', 'last_name'])
    ->get();

withSimpleProfile包含的内容如下:

public function withSimpleProfile($columns) 
{
    $this->with([
        'profile' => function ($query) use ($columns) {
            $query->addSelect(['id', 'user_id', 'first_name', 'last_name']);
        }]);

    return $this;
}

有办法做到这一点吗?

更新

构建器中似乎有一个方法macro,但无法确定其使用位置和方式。

ALTERNATIVE(不满意的解决方案)

通常对于可重用的方法,我创建一个UserRepository,但它包含用于调用的原始代码示例,但我想在查询中添加自定义链式方法以简化重用,而不是将它紧密耦合。似乎最可能的方法是创建我自己的Illuminate/Eloquent/Builder.php并添加方法并以某种方式使用此构建器而不是?但是,Laravel总是有这些伟大的方法让它看起来更容易扩展。

这似乎暂时有用,并继续使用UserRepository的DI,但出于某种原因,它并不是很精致:

User::whereNotIn('id', $ids)
    ->select(['id', 'email'])
    ->with($this->users->simpleProfile())
    ->get();

UserRepository :: simpleProfile返回的地方:

public function simpleProfile() {

    return [
        'profile' => function ($query) {
            $query->addSelect(['id', 'user_id', 'first_name', 'last_name']);
        },
    ];
}

1 个答案:

答案 0 :(得分:2)

范围是否解决了您的问题?

https://laravel.com/docs/5.2/eloquent#local-scopes