В 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
];
}






Вы можете добиться того, чего хотите, вот так:
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)
@bernhardh Похоже, у вас есть другой вопрос, не могли бы вы опубликовать его как другой вопрос с более подробной информацией?
Вопрос скорее риторический. Ваш ответ устраняет проблему, которой у создателя вопроса не было и которой, как правило, не должно быть вообще, так как называть внешний ключ таким образом - не лучшая практика.
@bernhardh Я не помню причину этого наименования, но да, соглашения об именах должны быть правильными.
Почему вы должны называть внешний ключ не постфиксом
_id?