Laravel Красноречивый атрибут Атрибут Отношения - PullRequest
1 голос
/ 06 марта 2020

Я пытаюсь загрузить отношения с нетерпением загрузки. Но хотел бы передать атрибут в функцию отношения.

(Laravel 6.x)

Модель - taxChildren () требует идентификатор

public function taxChildren($moduleId)
{
    return $this->hasMany($this, 'parent')->where('module', '=', $moduleId')->orderBy('created_at', 'asc');
}

Контроллер

$departments = tax::where([
        ['module', '=', $this->departmentsModuleId],
    ])
        ->whereNull('parent')
        ->with([
            'taxChildren' => ['moduleId', '2']
        ])
        ->get();

Теперь я знаю, что могу передать запрос на мои отношения следующим образом:

$departments = tax::where([
        ['module', '=', $this->departmentsModuleId],
    ])
        ->whereNull('parent')
        ->with([
            'taxChildren' => function($query){
                $query->where('module', '=', $this->departmentsModuleId);
            },
        ])
        ->get();

но я буду использовать это часто с несколькими отношениями, которые похожи. У кого-нибудь есть идеи, как этого добиться? Спасибо!

1 Ответ

1 голос
/ 06 марта 2020

Вы не можете передать аргумент непосредственно функции отношения, но это можно сделать с помощью свойств модели

Mymodel. php
class MyModel extends Model {
    protected $moduleId = null;

    public function taxChildren(){
        return $this->hasMany($this, 'parent')->where('module', '=', $this->moduleId)->orderBy('created_at', 'asc');
    }
}
MyController. php
use App\MyModel;
...
class MyController extends Controller {

    public function controllerMethod(){
        $query = new MyModel;
        $query->moduleId = 1;

        $departments = $query::where([
            ['module', '=', $this->departmentsModuleId],
        ])
        ->whereNull('parent')
        ->with(['taxChildren'])
        ->get();
    }
}

Также вы можете использовать laravel области запроса для установки свойства modelId. Я думаю, что это намного чище код

Mymodel. php
class MyModel extends Model {
    protected $moduleId = null;

    public function scopeMudule($q, $module_id){
        $this->moduleId = $module_id;
        return $q;
    }

    public function taxChildren(){
        return $this->hasMany($this, 'parent')->where('module', '=', $this->moduleId)->orderBy('created_at', 'asc');
    }
}
MyController. php
use App\MyModel;
...
class MyController extends Controller {

    public function controllerMethod(){
        $departments = $query::module(1)->where([
            ['module', '=', $this->departmentsModuleId],
        ])
        ->whereNull('parent')
        ->with(['taxChildren'])
        ->get();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...