首页 文章

具有嵌套的belongsTo关系的Laravel范围查询

提问于
浏览
1

我有一个 Product 模型,需要与 ProductOptionsProductOptionValues 模型连接 .

Products :: getAll()应返回一个JSON,其中包含连接到产品的选项的嵌套视图,产品选项值连接到product选项,这样:

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)

Product Options

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();
});

Product Option Values

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();
});

Product Option 型号:

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);
    }

    ...
    ...
}

Product Option Value 型号:

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);
    }

    ...
    ...
}

Product 型号:

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数据中还包含嵌套在产品"options"键中的Option Values?我已经将 scopeWithCompleteData 方法用于从JSON API处理程序调用的 Products 模型,但是无法理解如何嵌套和过滤选项和选项值的值以表示JSON数组,如在问题的一开始 .

1 回答

  • 1

    你尝试过加载吗?

    Product::with('product_option_values')->get()->toJson()
    

相关问题