我有一个雄辩的模型,叫做“客户”。客户与另一个模型“图像”具有一对多关系。我想对客户拥有的图像进行分组,以便可以将它们分配给不同的用例-例如,客户将有一个徽标图像,而其图库区域则有很多图像。
如何在Laravel中为关系分配用例?
我想我将创建一个名为“用例”的中间模型,然后使用hasManyThrough
方法访问图像。我系统中的许多关系都需要定义其用例。我是laravel的新手,这是框架中已经介绍的内容吗?
编辑: 我还想将未使用的图像分配给客户-因此我可以上传一堆图像并说它们属于特定客户,但是直到我们分配了“用例”(即“ ,“徽标”或“图库”)。这样,我将拥有一个分配给客户的所有图像的图像库,然后是一个分配为“图库”的图像库。布雷,这有意义吗?
答案 0 :(得分:0)
我可以想到3种方法来实现这一目标。
1:您将“徽标”变成“客户”列,而不是一个单独的模型,并为所有图库图像保留“图像”。
2:您将“徽标”转换为单独的模型,与“客户”和“图片”相同
3:使您的生活复杂化,将“徽标”和图库图像保留为“图像”,然后添加一种区分两者的方法(可能是标志:is_logo或枚举列:image_type)。
如果您问我,第二个选项最吸引人。
答案 1 :(得分:0)
您可以为此使用Polymorphic Relationships
关系,也可以分开2张图片表
客户可以有1个徽标 客户可以拥有1张或多张图片
$customer = new Customer;
$customer->with('images', 'logo')->get();
这将帮助您在一组结果中查询所有图像和徽标。
答案 2 :(得分:0)
对于同一模型,您可以使用2个关系。
型号:
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 }}
答案 3 :(得分:0)
我认为最干净的方法是...
1)拥有一个“ UseCase”表,该表可以定义所有类型的用例。这样一来,就可以实现简单的可伸缩性和可读性,而不会使图像表中出现一堆新的VARCHAR或其他内容。
2)在“图像”表中创建一个“ use_case”列,并为每个图像从上方的“ UseCase”表中分配相应的ID。
3)在UseCase.id = Image.use_case上的“图像”和“ UseCase”之间创建hasOne / belongsTo关系
4)在“客户”表中创建一个范围,如下所示...
public function scopeUseCase($query, $case){
$query->with(['Image.UseCase' => function($relationQuery) use ($case) {
return $relationQuery->where('name', '=', $case);
}]);
}
5)最后,使用类似这样的作用域在查询中按名称引用案例。
Customer::useCase('logo')->get();
应该是一个非常干净直接的过程。很抱歉出现在手机上的格式化问题。