Laravel-扩展用户模型

Ali*_*ouf 1 laravel

我有一类Sellerextendslaravel的User模型,如下

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

ModelFactory.php我有以下代码

$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
 ];
});
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

找不到基本表或视图:1146表'tutorial.sellers'不存在(SQL:从sellers存在的位置选择*(从。= 。products位置选择* ))sellersidproductsseller_id

Product类是因为以下

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

}
Run Code Online (Sandbox Code Playgroud)

显然,生成的查询没有考虑继承。我尝试更改$seller = Seller::has('products')->get()->random();为,$seller = User::has('products')->get()->random(); 但是'product_id' => $seller->products->random()->id由于该products()方法是在seller类中定义的,因此该行会导致错误,这是最好的方法?

这是扩展User类的正确方法吗?

我一直在寻找扩展User课程的方法。我发现了这个问题:Laravel中的模型继承对 我没有帮助。

我正在使用Laravel 5.4.36,PHP 7.1.11

Ohg*_*why 5

总结一下:

Class Name如果未在模型上明确声明,Laravel将使用用作表名。这会使Laravel自动假定sellers为查询中的表名。要解决此问题,请将以下内容添加到扩展模型中:

protected $table = 'users'
Run Code Online (Sandbox Code Playgroud)

最后,您尝试->random()在查询生成器实例上使用,但这不是您想要的。您想在集合上使用它。您可以执行以下任一操作:

$seller->products()->get()->random()->id;
Run Code Online (Sandbox Code Playgroud)

上面的代码将执行查询并检索所有产品,然后从返回的集合中获取一个随机物品,然后检索ID。更好(更有效)的方法是让“查询”构建器处理它:

$seller->products->inRandomOrder()->first()->id;
Run Code Online (Sandbox Code Playgroud)