我正在尝试为我的应用程序创建一个图像库,因此我可以从我的Laravel API请求图像。
图片根据应用中的位置分为不同类型,如“sidemenu”,“topbanner”等。
某些图片可以使用其他属性,例如“url”,“text”等。这些属性会因image-type
而异。因此,“侧面菜单”类型的图像可能采用称为“字体颜色”的属性或类似的东西。
我的db-structure看起来像这样:
因此,我们的想法是让所有具有image_type
的图像具有像“sidemenu”这样的特定slug。然后,我想加入image_type_attributes
上的所有image_type
,最后加入他们的价值观。
我已将值和image_type_attributes
拆分为自己的表格,因此我可以将这些属性用作模板,以便用户在上传图片时可以填写哪些属性。
这几乎可以工作,但是我的代码/关系出了问题,因为图像和image_value之间的关系被忽略了,所以我最终得到的值只是属于给定image_type
的第一个实例。数据库 - 这应该是与图像相关的值。
(现在我在我的所有图像上输入第一张图像的值)
这些是我的模特:
图片
class Image extends Model
{
protected $table = 'images';
public function attributes(){
return $this->type->attributes();
}
public function type(){
return $this->belongsTo(ImageType::class, 'image_type_id');
}
}
将ImageType
class ImageType extends Model
{
protected $table = 'image_type';
public function images(){
return $this->hasMany(Image::class);
}
public function account(){
return $this->belongsTo(Account::class);
}
public function attributes(){
return $this->hasMany(ImageTypeAttribute::class);
}
}
ImageTypeAttribute
class ImageTypeAttribute extends Model
{
protected $table = 'image_type_attribute';
public function value(){
return $this->hasOne(ImageValue::class, 'image_type_attribute_id');
}
}
imageValue时
class ImageValue extends Model
{
protected $table = 'image_value';
}
我的控制器:
// 1. Get all active images with some slug ex. "sidemenu"
// and get the image-attributes and values as well
$images = Image::whereHas('type', function($query) use ($image_slug, $slug){
$query->where('slug', $image_slug);
})
->with('attributes')
->where('active', 1)
->get();
// 2. Loop through all images, and get the image attribute-names and values
$image_array = [];
foreach($images as $image){
$image_array['image'] = $image->image;
foreach($image->type->attributes as $attribute){
$image_array[$attribute->name] = $attribute->value->value;
}
}
return $image_array;
任何想法我做错了什么?