Laravel Nova Самореферентные отношения

В Laravel, если я хочу создать ссылку на себя, я могу сделать следующее:

class Post extends Eloquent
{
    public function parent()
    {
        return $this->belongsTo('Post', 'parent_id');
    }

    public function children()
    {
        return $this->hasMany('Post', 'parent_id');
    }
}

Как сделать так, чтобы ресурс Laravel Nova отображал это соединение?

public function fields(Request $request)
{
    return [
        Text::make('Autor', 'author'),
        Select::make('Type', 'type')->options([
            'News' => 'news',
            'Update' => 'update',
        ]),
        BelongsToMany::make('Post') // does not work
    ];
}

1 ответ

Решение

Вы можете достичь того, что вы хотите, как это:

BelongsTo::make('Parent', 'parent', Post::class),

HasMany::make('Children', 'children', Post::class),

Это позволит выбрать родительский пост при создании или обновлении поста. Когда вы находитесь на странице подробностей поста, вы можете видеть всех его потомков.

public function fields(Request $request)
{
    return [
        Text::make('Autor', 'author'),
        Select::make('Type','type')->options([
            'News' => 'news',
            'Update' =>  'update',
        ]),
        BelongsTo::make('Parent', 'parent', Post::class),
        HasMany::make('Children', 'children', Post::class),
    ];
}

Есть другая ситуация, когда вы обнаружите ту же проблему, если у вас есть имя родительского столбца. parent а также отношения parent нравиться

$table->bigIncrements('id');
$table->string('category');
$table->unsignedBigInteger('parent')->nullable();

и в модели

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

Он не сможет распознать parent свойство, и вы снова столкнетесь с этой проблемой. В этом случае вы можете изменить relationship name или column name, и он будет работать нормально.

Также помните аргументы в пользу Новы BelongsTo отношения

Аргумент 1. Имя для отображения (например, Parent)

Аргумент 2. Имя отношения, используемое в модели (например, parent)

Аргумент 3. Ресурс Nova (например, App\Nova\Category)

Другие вопросы по тегам