Laravel版本:7.0
reviews
表(Model-Review(包含id
、product_type
、product_id
和rating
列。
product_type
可以是service
、plugin
、module
,每个值都有自己的模型AppService
、AppPlugin
、AppModule
。我可以将model names
直接放在product_type
中,但我更喜欢使用这些值。这里是Review
模型关系。
public function plugin()
{
return $this->belongsTo(Plugin::class, "product_id")->withDefault();
}
public function module()
{
return $this->belongsTo(Module::class, "product_id")->withDefault();
}
public function service()
{
return $this->belongsTo(Service::class, "product_id")->withDefault();
}
public function getItem()
{
if($this->product_type=='module')
{
return $this->module;
}elseif($this->product_type=='service')
{
return $this->service;
}else {
return $this->plugin;
}
}
现在我想让他们在审查模型中热切加载如下:
$reviews = Review::with("getItem")->get();
如果没有Eagle加载,我可以使用$review->getItem()->name
//这将返回产品的名称。
我如何才能在装载量很大的情况下得到它们?
您本可以很容易地将其实现为多态关系。在你的评论模型中,你可以这样做:
模型结构
App\Review.php
<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class Review extends Model
{
public function reviewable()
{
return $this->morphTo();
}
}
然后将reviews((方法添加到App\Service、App \Plugin和App \Module模型中
public function reviews()
{
return $this->morphMany('AppReview', 'reviewable');
}
表格结构
您的评论表格可能如下所示:
reviews
id - integer
body - text
reviewable_id - integer
reviewable_type - string
注意reviewable_id
和reviewable_type
字段。CCD_ 20存储所审查项目的id,CCD_ 21存储与该项目相关的模型。
检索关系
您可以通过您的模型访问这些关系。例如,要访问服务的所有评论,我们可以使用评论动态属性:
$service = AppService::find(1);
foreach ($service->reviews as $review) {
//
}
您还可以通过访问执行morphTo调用的方法的名称,从多态模型中检索多态关系的所有者。在您的案例中,这是Review模型上的可审核方法。因此,我们将把该方法作为一个动态属性来访问:
$review = AppReview::find(1);
$reviewable = $review->reviewable;
可审核文件将返回审核模型Service
、Plugin
或Module
上的模型