Laravel - 扩展用户模型

时间:2017-12-07 20:47:58

标签: laravel

我有Seller laravel extends模型的课程User 如下

namespace App; 
class Seller extends User{
   public function products(){
       return $this->hasMany(Products::class);
   }
}
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
 ];
});

我收到以下错误

  

找不到基表或视图:1146表'tutorial.sellers'没有   存在(SQL:select * from sellers where exists(select * from。)   products sellersid = productsseller_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);
    }

}

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

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

我已经搜索了扩展User类的方法。 我发现了这个问题:Model Inheritance in Laravel 虽然没有帮助我。

我正在使用Laravel 5.4.36,PHP 7.1.11

1 个答案:

答案 0 :(得分:4)

总结:

如果未在模型上明确声明,Laravel将使用Using wordApplication As Object = New Microsoft.Office.Interop.Word.Application End Using 作为表名。这会导致Laravel自动将Class Name假设为查询中的表名。要解决此问题,请将以下内容添加到扩展模型中:

sellers

最后,您尝试在查询构建器实例上使用protected $table = 'users' ,但这不是您想要的。您想在集合中使用它。您可以执行以下任何操作:

->random()

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

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