web-dev-qa-db-fra.com

Laravel comment ajouter une fonction personnalisée dans un modèle Eloquent?

J'ai un modèle de produit

class Product extends Model
{
    ...

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

    ...
}

Je veux ajouter une fonction qui retournera le prix le plus bas, et dans le contrôleur je peux obtenir la valeur en utilisant:

Product::find(1)->lowest;

J'ai ajouté ceci dans le modèle de produit:

public function lowest()
{
    return $this->prices->min('price');
}

mais j'ai eu une erreur en disant:

Relationship method must return an object of type Illuminate\Database\Eloquent\Relations\Relation

Et si j'utilise Product::find(1)->lowest();, cela fonctionnera. Est-il possible de faire fonctionner Product::find(1)->lowest;?

Toute aide serait appréciée.

13
Harrison

Lorsque vous essayez d'accéder à une fonction du modèle en tant que variable, Laravel suppose que vous essayez d'extraire un modèle associé. Ils les appellent propriétés dynamiques. Vous avez plutôt besoin d'un attribut personnalisé.

ajoutez la méthode suivante à votre modèle:

public function getLowestAttribute()
{
    //do whatever you want to do
    return 'lowest price';
}

Vous devriez maintenant pouvoir y accéder comme ceci:

Product::find(1)->lowest;
29
Rahul M

Utilisez Eloquent accessors

public function getLowestAttribute()
{
    return $this->prices->min('price');
}

Ensuite 

$product->lowest;
10
huuuk

pourquoi tu ne fais pas ça? Je sais que ce n'est pas ce que vous avez demandé en particulier et que cela peut parfois être une mauvaise pratique. mais dans votre cas, je suppose que c'est bien.

$product = Product::with(['prices' => function ($query) {
   $query->min('price');
}])->find($id);
2
Achraf Khouadja

vous pouvez utiliser les méthodes ci-dessus ou utiliser la méthode suivante pour ajouter une fonction directement dans le modèle existant:

class Company extends Model
{
    protected $table = 'companies';

    // get detail by id
    static function detail($id)
    {
        return self::find($id)->toArray();
    }

    // get list by condition
    static function list($name = '')
    {
        if ( !empty($name) ) return self::where('name', 'LIKE', $name)->get()->toArray();
        else return self::all()->toArray();
    }
}

Ou utilisez Illuminate\Support\Facades\DB; dans votre fonction. J'espère que cela aidera les autres.

0
May Weather VN