Как добавить новую цепочку методов для Laravel Eloquent? - PullRequest
1 голос
/ 06 мая 2020

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

Модель пользователя:

public function products()
{
    return $this->hasMany('App\Product');
}

public function obsolate()
{
    return $this->where('status', 'obsolate');
}

Когда я пытаюсь получить, например, auth()->user()->products()->obsolate(), появляется некоторая ошибка, например

BadMethodCallException: вызов неопределенного метода Illuminate \ Database \ Eloquent \ Relations \ HasMany :: obsolate ()

Но Если мне нравится auth()->user()->products()->where('status', 'obsolate')->get() Работает.

Пожалуйста, поправьте меня, если я ошибаюсь ...


ОБНОВЛЕНИЕ

Модель продукта:

public function user()
{
    return $this->belongsTo('App\User');
}

public function scopeObsolate($query)
{
    return $query->where('status', 'obsolate');
}

Я делаю auth()->user()->products->obsolate()->get(), и это работает!

Но, если я хочу использовать группу ограничений для решения этой проблемы , он вернет ошибку

public function scopeObsolate(Builder $builder)
{
    return $builder->where(function (Builder $query) {
        return $query->where('status', 'obsolate');
    });
}

Аргумент 1, переданный в App \ Product :: App {closure} (), должен быть экземпляром App \ Builder, заданным экземпляром Illuminate \ Database \ Eloquent \ Builder


РЕШЕНО

use Illuminate\Database\Eloquent\Builder

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Потому что products() метод возвращает Illuminate\Database\Eloquent\Relations\HasMany объект. Когда вы применяете к нему where, laravel устанавливает ограничения на запрос отношения (это означает Product красноречивый строитель). Итак, вам нужно определить метод в модели продукта.

И измените метод obsolate на scope method:

// Product model:
public function scopeObsolate($query)
{
    return $query->where('status', 'obsolate');
}

Обновление:

Вторая ошибка возникает из-за подсказки типа, laravel не может найти Builder в модели. Вам необходимо

use Illuminate\Database\Eloquent\Builder
1 голос
/ 06 мая 2020

Я не использую Laravel, но:

Кажется, ваш ->where / ->hasMany возвращает другой (внутренний) объект, который не содержит ваш собственный метод.

Кому цепочка правильно, возврат $this только:

class FooBar extends \Illuminate\Database\Eloquent
{

    public function products()
    {
        $this->hasMany('App\Product');

        return $this;
    }

    public function obsolate()
    {
        $this->where('status', 'obsolate');

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