是否可以为模型关系“别名”?

问题描述 投票:0回答:1

我有一个带有给定声明“类别”关系的包,如下所示:

public function category()
{
    return $this->belongsTo(ProductCategory::class);
}

在实现包的应用程序中,关系被重新定义如下:

public function vintage()
{
    return $this->belongsTo(Vintage::class, 'vintage_id', 'id');
}
public function category()
{
    return $this->vintage();
}

当在应用程序端急切加载“Vintage”关系时,一切都很好,但在包端却不然。每次包尝试引用“类别”关系时,它都会触发对 SQL 数据库的调用来加载“类别”关系 - 我试图避免这种情况。

我的问题;有没有什么方法可以“别名”(或者无论你如何称呼它),让关系“Vintage”在包中与“Category”起到相同的作用?

我知道加载关系时,它会“按照定义”出现在关系列表中。 我正在考虑的一个选项是在应用程序端加载这两个关系,以便包可以在不生成 SQL 调用的情况下找到它。

mysql laravel relation
1个回答
0
投票

也许使用动态关系。这允许您定义一个关系,该关系可以根据某些条件返回不同类型的相关模型。

public function category()
{
    if ($this->shouldUseVintageRelation()) {
        return $this->vintage();
    }

    return $this->belongsTo(ProductCategory::class);
}

public function vintage()
{
    return $this->belongsTo(Vintage::class, 'vintage_id', 'id');
}

protected function shouldUseVintageRelation()
{
    // Determine whether to use the 'vintage' relation.
    // This could be based on a property of the model, a configuration setting, etc.
    // For example:
    return config('app.use_vintage_relation');
}
© www.soinside.com 2019 - 2024. All rights reserved.