Laravel/Eloquent - 创建与可能具有或不具有属性的父模型相关的多个子模型的关系

Posted

技术标签:

【中文标题】Laravel/Eloquent - 创建与可能具有或不具有属性的父模型相关的多个子模型的关系【英文标题】:Laravel/Eloquent - Creating relationship of multiple child models related to a parent model that may or may not have an attribute 【发布时间】:2021-10-09 09:53:31 【问题描述】:

我是初学者,不会说英语,所以我提前道歉。

我想这应该用访问器或某种多态关系来回答。但我很好理解它,所以寻找一个简单的例子来更好地理解它。或者也许这可以通过其他方法来实现?

有一个父参考模型:

身份证 reference_name

和多个子模型相关:

身份证 宽度 长 权重(此字段可能存在也可能不存在/写为INT) thickness (此字段可能存在也可能不存在/写为 INT) 每个模型的其他特定字段

有些孩子只有厚度,有些只有体重,有些可能两者都有。我不能只创建一个表并让它为空。每个子类别必须有多个表,所以我必须有多个模型。

一个孩子可以是:

子类别 1

身份证 宽度 长 重量

子类别2

身份证 宽度 长 厚度

子类别 3

身份证 宽度 长 重量 厚度

我是否可以像这样从父引用创建关系并访问属性:

$reference->thickness;

如果存在则应该检索 witdth,如果不存在则返回 null。

【问题讨论】:

为什么要为每个子类别使用多个模型? 最终这些子类产品的价格应该由绝对不同的参数来计算。所以我决定把每一个都分成不同的子类别,用它们自己的属性。但其中一些可能会或可能不会共享一些。 【参考方案1】:

好的,我找到了解决方案。这是一个简单的一对一(多态)关系。

https://laravel.com/docs/8.x/eloquent-relationships#one-to-one-polymorphic-relations

---旧---

我用这样的东西做了一个丑陋的工作。仍在等待是否有人可以知道完成这项工作的优雅方法

class Reference extends Model 

....

public function getCustom($searchedAttribute)

    $group = $this->group;

    if(!$group)
        return Null;
    

    $reference_id= $this->id;

    switch($group->name)
        case 'subcategory1':
            $reference = Subcategory1::where('reference_id','=',$reference_id)->first();
            if(isset($reference->$searchedAttribute))
                return $reference->$searchedAttribute;
            else
                return Null;
            
            break;

        case 'subcategory2':
            $reference = Subcategory2::where('reference_id','=',$reference_id)->first();
            if(isset($reference->$searchedAttribute))
                return $reference->$searchedAttribute;
            else
                return Null;
            
            break;  
         
        case n:
            ...
            break;
        

        default:
            return Null;
            break;
    



【讨论】:

以上是关于Laravel/Eloquent - 创建与可能具有或不具有属性的父模型相关的多个子模型的关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 关系与多个带有“OR”的外键

Laravel Eloquent 多列 IN 子句

Laravel Eloquent group by 与数据透视表和关系

Laravel Eloquent 所有与关系

Laravel eloquent 如何动态创建关系?

如何创建 Laravel Eloquent 实体的空实例