У меня есть модель продукта
class Product extends Model { ... public function prices() { return $this->hasMany('App\Price'); } ... }
Я хочу добавить функцию, которая вернет самую низкую цену, а в контроллере я могу получить значение, используя:
Product::find(1)->lowest;
Я добавил это в модель продукта:
public function lowest() { return $this->prices->min('price'); }
но я получил сообщение об ошибке:
Relationship method must return an object of type Illuminate\Database\Eloquent\Relations\Relation
И если я использую Product::find(1)->lowest();
, это будет работать. Можно ли получить Product::find(1)->lowest;
работать?
Любая помощь будет оценена по достоинству.
Когда вы пытаетесь получить доступ к функции в модели как переменной, laravel предполагает, что вы пытаетесь получить связанную модель. Они называют их динамическими свойствами. Вместо этого вам нужен пользовательский атрибут.
добавьте к вашей модели следующий метод:
public function getLowestAttribute() { //do whatever you want to do return 'lowest price'; }
Теперь вы должны иметь доступ к нему следующим образом:
Product::find(1)->lowest;
Использовать аксеспарины «Красноречивый»
public function getLowestAttribute() { return $this->prices->min('price'); }
затем
$product->lowest;
почему вы просто не делаете этого? я знаю, это не то, о чем вы просили специально, и иногда это может быть плохой практикой. но в вашем случае я думаю, что это хорошо.
$product = Product::find(1)->with(['prices' => function ($query) { $query->min('price'); }])->get();