Laravel:一个模型引用另外两个模型

时间:2016-08-17 10:42:20

标签: laravel eloquent

我有一个有两张桌子的拍卖网站:拍卖和拍卖。拍卖和拍卖(属于拍卖)都可以包含图像。

从数据库的角度来看,我创建了一个名为images_auctions的表(具有拍卖ID的外键)和一个名为lots_images的表(具有该批次ID的外键)。

我的拍卖模型中也有以下内容:

class Auction extends Model
{
    protected $table = 'auctions';

    public function lots() {
        return $this->hasMany(Lot::class);
    }

    public function images() {
        return $this->hasMany(Image::class);
    } 
}

并且在Lots模型中,我有:

   class Lot extends Model {

    protected $table = 'lots';

    public function auction() {
        return $this->belongsTo(Auction::class);
    }

    public function images() {
        return $this->hasMany(Image::class);
    }
}

然后我想创建一个包含以下内容的Image模型:

class Image extends Model
{
    protected $table = 'images';

    public function auction() {
        return $this->belongsTo(Auction::class);
    }

    public function lot() {
        return $this->belongsTo(Lot::class);
    }    
}

是否可以有一个名为Images的模型同时引用Auction和Lot(使用belongsTo方法)。或者我应该创建两个模型(ImageAuction和ImageLot)来实现这个目标吗?

另外,从数据库的角度来看,是否有更好的方法而不是创建两个单独的图像表(images_auctions和images_lots)?

1 个答案:

答案 0 :(得分:2)

是否有可能有一个名为Images的模型同时引用Auction和Lot。它称为多态关系。
予。型号
I.1。批量模型

class Lot extends Model
{
    public function auction() {
        return $this->belongsTo(Auction::class);
    }

    public function images() {
        return $this->morphMany(Image::class, 'imageable');
    }
}

I.2。拍卖模式

class Auction extends Model
{
    public function lots() {
        return $this->hasMany(Lot::class);
    }

    public function images() {
        return $this->morphMany(Image::class, 'imageable');
    }
}

I.3。图像模型

class Image extends Model
{
    public function imageable(){
        return $this->morphTo();
    }
}

<强> II。表格结构

auctions
    id - integer

lots
    id - integer
    auction_id - integer

images
    id - integer
    imageable_id - integer
    imageable_type - string
    image_link - string

<强> III。实施例

id    | imageable_id | imageable_type | image_link
1     |        1     |   App\Lot      |  img1
2     |        2     |   App\Auction  |  img2

<强> IV。通知 如果你不想让人头痛的话,你应该像上面一样方便地遵循Laravel的名字。