Laravel Multi BelongsTo RelationShip Merge with Eager Loadin



Laravel版本:7.0

reviews表(Model-Review(包含idproduct_typeproduct_idrating列。

product_type可以是servicepluginmodule,每个值都有自己的模型AppServiceAppPluginAppModule。我可以将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\ServiceApp \PluginApp \Module模型中

public function reviews()
{
return $this->morphMany('AppReview', 'reviewable');
}

表格结构

您的评论表格可能如下所示:

reviews
id - integer
body - text
reviewable_id - integer
reviewable_type - string

注意reviewable_idreviewable_type字段。CCD_ 20存储所审查项目的id,CCD_ 21存储与该项目相关的模型。

检索关系

您可以通过您的模型访问这些关系。例如,要访问服务的所有评论,我们可以使用评论动态属性:

$service = AppService::find(1);
foreach ($service->reviews as $review) {
//
}

您还可以通过访问执行morphTo调用的方法的名称,从多态模型中检索多态关系的所有者。在您的案例中,这是Review模型上的可审核方法。因此,我们将把该方法作为一个动态属性来访问:

$review = AppReview::find(1);
$reviewable = $review->reviewable; 

可审核文件将返回审核模型ServicePluginModule上的模型

相关内容

  • 没有找到相关文章

最新更新