我使用的邏輯是這樣的幾個地方檢索用戶和他們的個人資料:Laravel 5.2擴展雄辯Builder和可重複使用的方法
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
將CONTA在類似的東西:
public function withSimpleProfile($columns)
{
$this->with([
'profile' => function ($query) use ($columns) {
$query->addSelect(['id', 'user_id', 'first_name', 'last_name']);
}]);
return $this;
}
有沒有辦法做到這一點?
UPDATE
是否有似乎是在構建器的方法macro,但不能揣摩出/它如何被使用。
選擇(不令人滿意的解決方案)
通常用於可重複使用的方法,我做一個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']);
},
];
}
它確實看起來像它。尤其是動態範圍界定也包含在內。乾杯! – mtpultz