我在几个地方使用这样的逻辑来检索用户及其个人资料:
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']);
},
];
}