代码之家  ›  专栏  ›  技术社区  ›  Abraham Brookes

为Laravel中的关系分配ID

  •  0
  • Abraham Brookes  · 技术社区  · 5 年前

    我有一个能言善辩的模型叫做“顾客”。客户与另一个模型“图像”有一对多的关系。我想对客户拥有的图像进行分组,这样我就可以将它们分配到不同的用例中——例如,一个客户的Logo只有一个图像,而他们的gallery部分有许多图像。

    我想我会制作一个名为“Usecase”的中介模型,然后使用 hasManyThrough 方法。我系统中的许多关系都需要定义它们的用例。我是新来的拉威尔,这是什么东西,已经涵盖在框架?

    编辑:

    1 回复  |  直到 5 年前
        1
  •  0
  •   JTinkers    5 年前

    我可以想出三种方法来实现这一点。

    2:你把“Logo”变成一个单独的模型,对“Customer”和“Image”都一样

    3:你把你的生活复杂化了,把Logo和gallery图片都保留为Image,然后添加一个区分这两个的方法(可能是一个flag:is\u Logo或者一个enum列:Image\u type)。

        2
  •  0
  •   Jesus Erwin Suarez    5 年前

    Polymorphic Relationships 关系或将两个图像表分开

    1. 客户

    客户可拥有1个徽标

    $customer = new Customer; 
    $customer->with('images', 'logo')->get();
    

    将帮助您在一组结果中查询所有图像和徽标。

        3
  •  0
  •   IndianCoding    5 年前

    同一个模型可以使用两个关系。

    型号:

    class Customer extends Model
    {
        public function gallery()
        {
            return $this->hasMany(Image::class)->where('type', 'gallery');
        }
    
        public function logo()
        {
            return $this->hasOne(Image::class)->where('type', 'logo');
        }
    }
    

    $customer = Customer::with(['gallery', 'logo'])->get();
    

    输出:

    @foreach($customer->gallery as $image)
        {{ $image->some_attribute }}
    @endforeach
    
    {{ $customer->logo->some_attribute }}
    
        4
  •  0
  •   SavvyK    5 年前

    我认为最干净的方法是。。。

    1) 有一个可以定义所有类型用例的“用例”表。这就允许了简单的可伸缩性和可读性,而不会用一堆新的varchar或其他什么东西把image表弄乱。

    2) 在“Image”表中创建一个“UseCase”列,并从上面的“UseCase”表中为每个图像分配相应的ID。

    4) 在“Customer”表中创建一个作用域,如下所示。。。

    public function scopeUseCase($query, $case){
        $query->with(['Image.UseCase' => function($relationQuery) use ($case) {
             return $relationQuery->where('name', '=', $case);
        }]);
    }
    

    5) 最后,在查询中使用诸如so。。。

    Customer::useCase('logo')->get();