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

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

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

有一个父参考模型:

  • 身份证
  • reference_name

和多个子模型相关:

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

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

一个孩子可以是:

子类别 1

  • 身份证
  • 宽度
  • 重量

子类别2

  • 身份证
  • 宽度
  • 厚度

子类别 3

  • 身份证
  • 宽度
  • 重量
  • 厚度

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

$reference->thickness;

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

【问题讨论】:

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

标签: laravel eloquent eloquent-relationship


【解决方案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;
    }


}

【讨论】:

    猜你喜欢
    • 2017-05-21
    • 2018-03-01
    • 2021-08-22
    • 2016-08-25
    • 2019-04-25
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 2021-05-13
    相关资源
    最近更新 更多