Laravel отображать дубликаты при наличии 1 записи в базе данных - PullRequest
1 голос
/ 13 июля 2020

Я новичок в Laravel. У меня небольшая проблема с Laravel.

У меня есть этот код:

$categories = $categoryRepository->descendantsAndSelf($slug ?? null); 

этот возврат:

Illuminate\Support\Collection {#535 ▼
  #items: array:17 [▼
    0 => 1
    1 => 2
    2 => 3
    3 => 4
    4 => 5
    5 => 6
    6 => 7
    7 => 8
    8 => 9
    9 => 10
    10 => 11
    11 => 12
    12 => 13
    13 => 14
    14 => 15
    15 => 16
    16 => 17
  ]
}

И мой репозиторий:

public function getProductFromIdCategories($categories)
    {
        return $this->model->select('name', 'slug', 'products.id', 'small_description')->with(['selectedCategory', 'frontImage'])->active()->leftJoin('selected_product_categories', function ($join) {
            $join->on('products.id', 'selected_product_categories.product_id');
        })->whereIn('selected_product_categories.category_id', $categories)->get();  
    }

Когда я запускаю свой код:

dd($this->model->getProductFromIdCategories($categories->toArray()));

У меня есть результат (дубликаты):

Illuminate\Database\Eloquent\Collection {#1484 ▼
  #items: array:3 [▼
    0 => App\Models\Product {#1497 ▼
      #fillable: array:12 [▶]
      #quarded: array:1 [▶]
      +timestamps: false
      #connection: "mysql"
      #table: "products"
      #primaryKey: "id"
      #keyType: "int"
      +incrementing: true
      #with: []
      #withCount: []
      #perPage: 15
      +exists: true
      +wasRecentlyCreated: false
      #attributes: array:4 [▼
        "name" => "Nazwa"
        "slug" => "nazwa"
        "id" => 1
        "small_description" => "mini opis"
      ]
      #original: array:4 [▶]
      #changes: []
      #casts: []
      #classCastCache: []
      #dates: []
      #dateFormat: null
      #appends: []
      #dispatchesEvents: []
      #observables: []
      #relations: array:2 [▶]
      #touches: []
      #hidden: []
      #visible: []
      #guarded: array:1 [▶]
    }
    1 => App\Models\Product {#1496 ▼
      #fillable: array:12 [▶]
      #quarded: array:1 [▶]
      +timestamps: false
      #connection: "mysql"
      #table: "products"
      #primaryKey: "id"
      #keyType: "int"
      +incrementing: true
      #with: []
      #withCount: []
      #perPage: 15
      +exists: true
      +wasRecentlyCreated: false
      #attributes: array:4 [▼
        "name" => "Nazwa"
        "slug" => "nazwa"
        "id" => 1
        "small_description" => "mini opis"
      ]
      #original: array:4 [▶]
      #changes: []
      #casts: []
      #classCastCache: []
      #dates: []
      #dateFormat: null
      #appends: []
      #dispatchesEvents: []
      #observables: []
      #relations: array:2 [▶]
      #touches: []
      #hidden: []
      #visible: []
      #guarded: array:1 [▶]
    }
    2 => App\Models\Product {#1493 ▼
      #fillable: array:12 [▶]
      #quarded: array:1 [▶]
      +timestamps: false
      #connection: "mysql"
      #table: "products"
      #primaryKey: "id"
      #keyType: "int"
      +incrementing: true
      #with: []
      #withCount: []
      #perPage: 15
      +exists: true
      +wasRecentlyCreated: false
      #attributes: array:4 [▼
        "name" => "Nazwa"
        "slug" => "nazwa"
        "id" => 1
        "small_description" => "mini opis"
      ]
      #original: array:4 [▶]
      #changes: []
      #casts: []
      #classCastCache: []
      #dates: []
      #dateFormat: null
      #appends: []
      #dispatchesEvents: []
      #observables: []
      #relations: array:2 [▶]
      #touches: []
      #hidden: []
      #visible: []
      #guarded: array:1 [▶]
    }
  ]
}

Мои модели:

class Product extends Model
{
    use ScopeActiveTrait;
    use Slugable;

    public function setNameAttribute($value)
    {
        $this->attributes['name'] = $value;
        $this->attributes['slug'] = $this->makeSlug($value);
    }

    protected $fillable = ['delivery_time', 'product_type', 'name', 'title', 'description', 'keywords', 'content', 'vat_id', 'category_id', 'enable', 'slug', 'small_description'];
    protected $quarded = ['id'];
    public $timestamps = false;

    public function vat()
    {
        return $this->belongsTo('App\Models\VAT', 'vat_id');
    }

    public function category()
    {
        return $this->belongsTo('App\Models\Category', 'category_id');
    }

    public function selectedCategory()
    {
        return $this->hasMany('App\Models\SelectedProductCategory', 'product_id', 'id');
    }

    public function related()
    {
        return $this->belongsTo('App\Models\RelatedProduct');
    }

    public function features()
    {
        return $this->hasMany('App\Models\SelectedProductFeature');
    }


    public function frontImage()
    {
        return $this->hasMany('App\Models\UploadImage', 'file_id', 'id')->orderBy('order', 'ASC')->where('file_type', 'products');
    }

}


class SelectedProductCategory extends Model
{
    protected $fillable = ['product_id', 'category_id'];
    protected $quarded = ['id'];


}

И схема:

Schema::create('products', function (Blueprint $table) {
            $table->id();
            $table->string('name', 155);
            $table->string('title', 155);
            $table->string('description', 155)->nullable();
            $table->string('keywords', 155)->nullable();
            $table->longText('content')->nullable();
            $table->string('delivery_time', 155)->nullable();
            $table->string('small_description', 155)->nullable();
            $table->smallInteger('vat_id')->unsigned()->default(1);
            $table->foreign('vat_id')->references('id')->on('vat');
            $table->bigInteger('category_id')->unsigned()->default(0);
            //$table->foreign('category_id')->references('id')->on('categories');
            $table->char('enable', 1)->default(0);
            $table->char('product_type', 1)->default(0);
            $table->string('promo_desc', 3)->nullable();
            $table->string('slug', 160)->nullable();
            $table->engine = "InnoDB";
            $table->charset = 'utf8mb4';
            $table->collation = 'utf8mb4_unicode_ci';
        });


Schema::create('categories', function (Blueprint $table) {
            $table->id();
            $table->string('category_name', 155);
            $table->string('description', 155)->nullable();
            $table->string('keywords', 155)->nullable();
            $table->longText('content')->nullable();
            $table->char('enable', 1)->default(0);
            $table->bigInteger('order')->default(0);
            $table->string('slug', 160)->nullable();
            NestedSet::columns($table);
            $table->engine = "InnoDB";
            $table->charset = 'utf8mb4';
            $table->collation = 'utf8mb4_unicode_ci';
        });


Schema::create('selected_product_categories', function (Blueprint $table) {
            $table->id();
            $table->bigInteger('product_id')->unsigned()->default(0);
            $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
            $table->bigInteger('category_id')->unsigned()->default(0);
            $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
            $table->timestamps();
        });

В БД у меня только 1 запись:

https://ibb.co/dWLY9nV

Laravel верните мне 3 записи. Почему у меня дубликаты? Как мне его отремонтировать?

Помогите, пожалуйста.

1 Ответ

3 голосов
/ 13 июля 2020

У вас есть отношение selectedCategory. Так почему вы используете левое соединение? Используйте этот код

public function getProductFromIdCategories($categories)
{
    return $this->model->select('name', 'slug', 'products.id', 'small_description')
    ->with(['selectedCategory', 'frontImage', 'selectedCategory' => function($q) use ($categories){
        $q->whereIn('category_id', $categories);
    }])->active()->get();  
}
...