Laravel 5.8 Eloquent: как фильтровать красноречивый запрос по атрибутам во многих отношениях - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть три angular Отношения "многие ко многим" между моделями "Продукт", "Категория" и "Атрибут".

  1. Продукт имеет отношение "ToMany" с категорией "ProductCategory"
  2. Категория "ProductCategory" имеет отношение "ToMany" с атрибутом
  3. Атрибут имеет отношение ToMany к Product

Модели выглядят следующим образом:

  1. Product. php
class Product extends Model
{
    public function productCategories()
    {
        return $this->belongsToMany(\App\Models\ProductCategory::class);
    }

    public function attributes()
    {
        return $this->belongsToMany(\App\Models\Attribute::class)->withPivot('attribute_value');
    }
}
ProductCategory. php
class ProductCategory extends Model
{
    public function products()
    {
        return $this->belongsToMany(\App\Models\Product::class, 'product_product_category');
    }
}
Атрибут. php
class Attribute extends Model
{
    public function productCategories()
    {
        return $this->belongsToMany(\App\Models\ProductCategory::class);
    }

    public function products()
    {
        return $this->belongsToMany(\App\Models\Product::class)->withPivot('attribute_value');
    }
}
веб. php
Route::post('product/{id}/get_attributes', 'ProductController@get_attributes');
ProductController. php
public function get_attributes($id, Request $request){
    // Some code goes here... <- This is where I am stuck!!!
    // Here, we have a product id and the array of product category ids through ajax post request.
}
Ajax запрос:
<script type="text/javascript">
    $('#product_categories').change(function(){
        var product_category_id = [];
        product_category_id = $(this).val();
        var product_id = {{$product->id}};
        // alert({{url('product/"+product_id+"/get_attributes')}});
        if(product_id != '')
        {
            $.ajax({
                url: "{{url('product/'.$product->id.'/get_attributes')}}",
                method: 'POST',
                data: {product_category_id:product_category_id,"_token": "{{ csrf_token() }}"},
                success: function(data) {
                    $("#attributes").html('');
                    alert(data);
                    $("#attributes").html(data);
                },
                error: function(data){
                    alert("Failure");
                    console.log(data);
                }
            });
        }
        else
        {
            $("#attributes").html('');
        }
    });
</script>

Я хочу написать код в функции get_attributes, который будет возвращать атрибуты:

  • , которые относятся к выбранным категориям
  • Кроме того, которые относятся к продукту с идентификатором $id в URL-адресе запроса или веб-маршруте.

На приведенном ниже снимке экрана представлена ​​небольшая визуализация того, чего я хочу достичь , Щелкните здесь, чтобы увидеть снимок экрана

Как показано на приведенном выше снимке экрана, я хочу заполнить таблицу атрибутов и значения атрибутов в соответствии с категориями, выбранными в «Multi-select категории продуктов», с помощью запроса ajax , Значения атрибутов также должны быть заполнены, когда это возможно. (Значения атрибутов хранятся в сводной таблице attribute_product).

Я потратил 2 дня, делая это по-разному. Если кто-нибудь скажет мне, как я могу достичь желаемого результата, тогда я буду очень благодарен.

...