2017-12-07 4 views
0

Ich habe eine Klasse Seller dass extends Laravel des User Modell wie die folgendeLaravel - Erweiterung User-Modell

namespace App; 
class Seller extends User{ 
    public function products(){ 
     return $this->hasMany(Products::class); 
    } 
} 

im ModelFactory.php Ich habe den folgenden Code

$factory->define(Transaction::class, function (Faker\Generator $faker) { 
    $seller = Seller::has('products')->get()->random(); 
    $buyer = User::all()->except($seller->id)->random(); 
    return [ 
    'quantity' => $faker->numberBetween(0, 3), 
    'buyer_id' => $buyer->id, 
    'product_id' => $seller->products->random()->id 
]; 
}); 

Ich erhalte die folgende Fehler

Basis Tabelle oder View nicht gefunden: 1146 Tabelle 'tutorial.sellers' existiert nicht vorhanden (SQL: auswählen * von sellers wo existiert (wählen * aus products wo sellers. id = products. seller_id))

die Product Klasse ist wie folgt

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Product extends Model{ 
    const AVAILABLE_PRODUCT = 'available'; 
    const UNAVAILABLE_PRODUCT = 'unavailable'; 

    protected $fillable = [ 
     'name', 
     'description', 
     'quantity', 
     'status', 
     'image', 
     'seller_id' 
    ]; 

    public function isAvailable(){ 

     return $this->status == Product::AVAILABLE_PRODUCT; 

    } 

    public function seller(){ 

     return $this->belongsTo(Seller::class); 

    } 

    public function categories(){ 

     return $this->belongsToMany(Category::class); 

    } 

    public function transactions(){ 
     return $this->hasMany(Transaction::class); 
    } 

} 

offenbar, die erzeugte Abfrage die Erbschaft nicht in Betracht zieht. Ich versuchte $seller = Seller::has('products')->get()->random(); in $seller = User::has('products')->get()->random(); ändern, aber dann wird die Linie 'product_id' => $seller->products->random()->id einen Fehler verursacht, da die products() Methode in seller Klasse definiert ist Was ist der beste Weg, dies zu tun?

Ist es ein richtiger Weg, Benutzerklasse zu erweitern?

Ich habe nach Möglichkeiten gesucht, die User Klasse zu erweitern. Ich habe diese Frage gefunden: Model Inheritance in Laravel hat mir zwar nicht geholfen.

Ich verwende Laravel 5.4.36, PHP 7.1.11

+0

Wenn nicht anders angegeben, verwendet Eloquent den Klassennamen schlangenverkleidet und Plural als Tabellenname. https://laravel.com/docs/5.5/eloquent#eloquent-model-conventions – lagbox

+1

Fügen Sie 'protected $ table =' users '; 'in Ihrer' Seller' Klasse hinzu. – Marwelln

+0

@Marwelln Danke ,, der oben erwähnte Fehler ist jetzt weg, aber ich bekomme diesen Fehler jetzt 'Call to undefined Methode Illuminate \ Database \ Query \ Builder :: random()' Nicht sicher, welche 'random' es referenziert –

Antwort

3

Fassen wir zusammen:

Laravel die Class Name als Tabellennamen verwenden, wenn nicht explizit auf das Modell erklärt. Dies bewirkt, dass Laravel automatisch sellers als Tabellenname in der Abfrage annimmt. Um dies zu beheben, die folgenden auf die Verlängerung Modell hinzu:

protected $table = 'users' 

Schließlich sind versuchen Sie ->random() auf einer Query Builder-Instanz zu verwenden, aber das ist nicht das, was Sie wollen. Sie möchten es für die Sammlung verwenden. Sie können eine der folgenden Aktionen ausführen:

$seller->products()->get()->random()->id; 

Die oben wird die Abfrage durchzuführen und alle Produkte abrufen, dann erhalten Sie einen Zufallsgenerator aus der Sammlung zurückgegeben, dann die ID abzurufen. Der bessere (effizientere) Weg ist, den Query-Builder damit umgehen zu lassen:

+0

@lagbox Sie können nur die Frage bearbeiten und ich kann zustimmen, aber ich aktualisierte die Wortwahl, um prägnanter zu sein – Ohgodwhy

Verwandte Themen