@Vova135798

Как сделать отношение модели к самой себе?

Я хочу сделать несколько уровней категорий. Как мне это сделать? Я попытался сделать, но мне выдает ошибку
SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'categories' already exists (SQL: create table `categories` (`id` bigint unsigned not null auto_increment primary key, `title` varchar(255) not null, `slug` varchar(255) null, `parent_id` bigint unsigned not null default '0', `created_at` timestamp null, `updated_at` timestamp null) default character set utf8mb4 collate 'utf8mb4_unicode_ci')


public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->string('slug')->unique()->nullable();
            $table->unsignedBigInteger('parent_id')->default(0);
            $table->timestamps();

            $table->foreign('parent_id')->references('id')->on('categories')->onDelete('CASCADE');
        });
    }
  • Вопрос задан
  • 99 просмотров
Пригласить эксперта
Ответы на вопрос 2
@KingstonKMS
Типы полей в связи должны быть одинаковыми. А ошибка у вас совсем не про связи
Ответ написан
Комментировать
ig0r74
@ig0r74
MODX-разработчик
Schema::create('categories', function (Blueprint $table) {
    $table->id();
    $table->foreignId('parent_id')->nullable()->constrained('categories')->cascadeOnDelete();
    $table->string('name');
    $table->mediumText('description')->nullable();
    $table->unsignedInteger('rank')->default(0);
    $table->boolean('active')->default(0);
    $table->timestamps();
});

В модели:
public function children(): HasMany
{
    return $this->hasMany(Category::class, 'parent_id');
}

public function parent(): BelongsTo
{
    return $this->belongsTo(Category::class, 'parent_id');
}

Вместо Category::class можно использовать static::class
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы