webentwicklung-frage-antwort-db.com.de

Laravel, wie man eine benutzerdefinierte Funktion in einem Eloquent-Modell hinzufügt?

Ich habe ein Produktmodell

class Product extends Model
{
    ...

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

    ...
}

Ich möchte eine Funktion hinzufügen, die den niedrigsten Preis zurückgibt, und im Controller kann ich den Wert mit Hilfe von:

Product::find(1)->lowest;

Ich habe dies im Produktmodell hinzugefügt:

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

aber ich bekam einen fehler mit:

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

Und wenn ich Product::find(1)->lowest(); benutze, wird es funktionieren. Ist es möglich, Product::find(1)->lowest; zur Arbeit zu bringen?

Jede Hilfe wäre dankbar.

13
Harrison

Wenn Sie versuchen, auf eine Funktion im Modell als Variable zuzugreifen, gehen Sie davon aus, dass Sie versuchen, ein verwandtes Modell abzurufen. Sie nennen sie dynamische Eigenschaften. Was Sie stattdessen benötigen, ist ein benutzerdefiniertes Attribut.

fügen Sie Ihrem Modell folgende Methode hinzu:

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

Jetzt sollten Sie in der Lage sein, darauf zuzugreifen:

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

Benutze eloquent accessors

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

Dann 

$product->lowest;
10
huuuk

warum machst du das nicht? Ich weiß, es ist nicht genau das, wonach Sie gefragt haben, und es könnte manchmal eine schlechte Praxis sein. Aber in Ihrem Fall ist es gut.

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

sie können die obigen Methoden verwenden oder die folgende Methode verwenden, um eine Funktion direkt in das vorhandene Modell einzufügen:

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();
    }
}

Oder verwenden Sie Illuminate\Support\Facades\DB. in Ihrer Funktion. Hoffe, das hilft anderen.

0
May Weather VN