Отношения со ссылками на себя в 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
    ];
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
6
0
3 077
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

BelongsTo::make('Parent', 'parent', \App\Nova\Post::class),

HasMany::make('Children', 'children', \App\Nova\Post::class),

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

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

Примечание: Обратите внимание, что третий параметр для BelongsTo::make() и HasMany::make() является ссылкой на Post Resource, а не на модель Post.

Существует еще одна ситуация, когда вы обнаружите ту же проблему, если у вас есть имя родительского столбца 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, и он будет работать нормально.

Также помните аргументы в пользу родства Nova BelongsTo.

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

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

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

Почему вы должны называть внешний ключ не постфиксом _id?

bernhardh 15.12.2020 17:52

@bernhardh Похоже, у вас есть другой вопрос, не могли бы вы опубликовать его как другой вопрос с более подробной информацией?

Prafulla Kumar Sahu 15.12.2020 17:55

Вопрос скорее риторический. Ваш ответ устраняет проблему, которой у создателя вопроса не было и которой, как правило, не должно быть вообще, так как называть внешний ключ таким образом - не лучшая практика.

bernhardh 16.12.2020 00:15

@bernhardh Я не помню причину этого наименования, но да, соглашения об именах должны быть правильными.

Prafulla Kumar Sahu 16.12.2020 11:44

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