我的产品模型需要与 ProductOptions 和 ProductOptionValues 模型相关联。
Products :: getAll()应返回一个JSON,其中包含连接到产品的选项的嵌套视图,产品选项值连接到product选项,in这样:
products: [
{
id: 1,
name: "product 1",
...
...
options: [
{
id: 1,
name: "option 1",
is_visible: 1,
description: "desc",
values: [
{
id: 1,
name: "option value 1",
sku: "test 1",
description: "desc 1",
unitary_price: 5.5
},
{
id: 2,
name: "option value 2",
sku: "test 2",
description: "desc 2",
unitary_price: 5.5
}
]
},
...
{
id: 20,
name: "option 20",
is_visible: 0,
description: "desc 2",
values: [
{
id: 30,
name: "option value 30",
sku: "test 30",
description: "desc 30",
unitary_price: 35.5
},
{
id: 40,
name: "option value 40",
sku: "test 40",
description: "desc 40",
unitary_price: 45.5
}
]
}
]
}
所以,我创建了2个不同的表(省略了Product Table create migration)
产品选项表
Schema::create('product_options', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('slug');
$table->text('description');
$table->boolean('is_visible')->index()->default(0);
$table->integer('product_id')->unsigned()->index();
$table->timestamps();
$table->softDeletes();
});
产品选项值表
Schema::create('product_option_values', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('sku');
$table->text('description');
$table->boolean('is_default_value')->index()->default(0);
$table->integer('product_option_id')->unsigned()->index();
$table->integer('product_id')->unsigned()->index();
$table->decimal('unitary_price', 10, 2);
$table->timestamps();
$table->softDeletes();
});
产品选项型号:
class ProductOption extends Model {
use SoftDeletes;
use SluggableTrait;
protected $dates = ['deleted_at'];
protected $guarded = ['id', 'created_at', 'updated_at'];
protected $sluggable = [
'build_from' => 'name',
'save_to' => 'slug',
'include_trashed' => true
];
public function product() {
return $this->belongsTo(Product::class);
}
public function productOptionValues () {
return $this->hasMany(ProductOptionValue::class);
}
...
...
}
产品选项价值型号:
class ProductOptionValue extends Model {
use SoftDeletes;
use SluggableTrait;
protected $dates = ['deleted_at'];
protected $guarded = ['id', 'created_at', 'updated_at'];
public function product() {
return $this->belongsTo(Product::class);
}
public function productOption() {
return $this->belongsTo(ProductOption::class);
}
...
...
}
产品型号:
class Product extends Model implements SluggableInterface {
use SoftDeletes;
use SluggableTrait;
protected $dates = ['deleted_at'];
protected $guarded = ['id', 'created_at', 'updated_at'];
protected $sluggable = [
'build_from' => 'name',
'save_to' => 'slug',
'include_trashed' => true
];
...
...
public function productOptions() {
return $this->hasMany(ProductOption::class);
}
public function productOptionValues() {
return $this->hasMany(ProductOptionValue::class);
}
}
问题是,如何获得一个产品对象,该产品对象在JSON数据中还包含嵌套在"选项"中的选项值。产品的关键?我已经将 scopeWithCompleteData 方法用于从JSON API处理程序调用的产品模型,但是不能了解如何筑巢和过滤选项和选项值的值,以表示JSON数组,就像在问题的开头发布的那样。
答案 0 :(得分:1)
您是否尝试过加载?
Product::with('product_option_values')->get()->toJson()