Laravel переписать $ model-> someQueryHere-> get () - PullRequest
0 голосов
/ 31 октября 2018

У меня есть класс SomeModel. Это ребенок SomeParentModel. SomeParentModel - это модель EloquentORM, и она прекрасно работает. Я хочу использовать пользовательский метод get() в SomeModel построителе запросов.

$someModel
    ->where('something')
    ->andWhere('something')
    ->orderBy('field')
    ->get()
//    ^^^
// This method must to be custom

Я пытался использовать Области применения модели , но, похоже, это не работает по умолчанию.

public function scopeGet($query)
    {
        $query = $this->filter($query);

        dd('I`m tried :( This code not running, because i dont see this messsage');

        return $query;
    }

public function filter($query;)
    {
        if ($this->id) {
            $query->where('id', $this->id);
            return $query
        }

        if ($this->name) {
            $query->where('name', 'like', "%$this->name%");
        }

        if ($this->phone) {
            $query->whereHas('phones', function (Builder $q) {
                $q->where('number', 'like', "%$this->phone%");
            });
        }

        return $query;
    }

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Ваш вопрос до сих пор не до конца понятен. Но если вы хотите создать что-то вроде вашего метода filter (). Laravel предлагает метод when () .

Это означает, что вы можете сделать что-то вроде:

$someModel
    ->when($id = $this->id, function($query) use ($id) {
        $query->where('id', $id)
     })
    ->when($name = $this->name, function($query) use ($name) {
        $query->where('name', $name)
     })
    ->when($phone = $this->phone, function($query) use ($phone) {
        $query->whereHas('phones', function (Builder $q) {
            $q->where('number', 'like', "%" . $phone);
        });
     })
    ->orderBy('field')
    ->get();
0 голосов
/ 31 октября 2018

Не уверен, к чему вы стремитесь, переопределив метод get(), но вы можете сделать следующее:

Все имеющиеся у вас модели простираются от Illuminate\Database\Eloquent\Model https://laravel.com/api/5.6/Illuminate/Database/Eloquent/Model.html

Вы можете создать новый класс, который наследуется от этой модели, переопределить нужный метод, а затем ваш SomeModel расширяет этот новый класс, который вы только что создали.

Однако я предлагаю (я не могу думать о функциональности, где вы хотите переопределить это), чтобы вы создали область (или даже глобальную область), если вы планируете создать другую компоновку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...