Обновления на основе ваших комментариев
Похоже, у вас есть отношения один к одному между Country и CountryPrice. Его можно прочитать следующим образом: «Страна имеет одну CountryPrice, и каждая CountryPrice принадлежит одной и только одной стране».
Это отношение может быть установлено с помощью: Модель страны
public function countryPrice()
{
return $this->hasOne(CountryPrice::class);
}
Модель CountryPrice
public function country()
{
return $this->belongsTo(Country::class);
}
Затем обновите сущности nova соответствующим образом: Ресурс страны
public function fields(Request $request)
{
return [
// ...
HasOne::make('Country Prices'),
// ...
];
}
Ресурс CountryPrice
public function fields(Request $request)
{
return [
// ...
BelongsTo::make('Country'),
// ...
];
}
Затем укажите свойство title в ресурсе Country nova, как я объяснил ниже в моем старом ответе:
/**
* The single value that should be used to represent the resource when being displayed.
*
* @var string
*/
public static $title = 'name';
В результате система позволит вам выбрать одна страна из поля выбора при создании записи CountryPrice из интерфейса nova. В индексе Country nova вы также увидите каждую страну с назначенной ей ценой.
Я надеюсь, что это правильное поведение, которое вам нужно. Если это не правильно, дайте мне знать, и я открою чат о переполнении стека, чтобы мы могли точно разобраться, что вам нужно, и решить проблему.
Старый ответ ниже
Исправление отношения
Я думаю, что ваши отношения установлены неправильно. Из схемы таблицы, которую вы разместили, похоже, что у каждого Country
может быть много CountryPrice
, потому что вы помещаете столбец country_id
в country_prices
.
Поэтому, если "Страна имеет много цен в стране" ", затем" Каждая CountryPrice принадлежит одной стране ".
Если я неправильно истолковал ваши отношения, дайте мне знать в комментариях правильный ответ, и я исправлю свой ответ.
Вы можете установить эти два отношения следующим образом:
Модель страны
public function countryPrices()
{
return $this->hasMany(CountryPrice::class);
}
Модель CountryPrice
public function country()
{
return $this->belongsTo(Country::class);
}
Затем обновите оба ресурса Nova для соответствия новым отношениям:
Ресурс страны
public function fields(Request $request)
{
return [
// ...
HasMany::make('Country Prices'),
// ...
];
}
Ресурс CountryPrice
public function fields(Request $request)
{
return [
// ...
BelongsTo::make('Country'),
// ...
];
}
Объяснение текущего исключения
App \ CountryPrice :: getCountryName Должен возвращать экземпляр отношения
Полученная ошибка не имеет ничего общего с самой Новой. Это происходит потому, что каждый (не stati c) метод, определенный в модели, должен быть либо областью запроса, аксессором / мутатором модели, либо отношением.
Это означает, что если вы определите getCountryName
, он будет рассматривается как отношение и должно возвращать экземпляр отношения, но вы возвращаете строку.
В вашем случае использования вам не нужно определять метод доступа. Вы можете использовать:
$countryPrice->country->name
в экземпляре CountryPrice
.
Исправление отображаемого заголовка
Чтобы исправить варианты Country
, отображаемые в BelongsTo
выберите входные данные для ресурса CountryPrice
, вы должны определить свойство или метод title
, которые будут использоваться именно для этой цели в классе ресурсов Nova, с которым вы ссылаетесь (Country
в вашем примере).
Вы можете использовать:
/**
* The single value that should be used to represent the resource when being displayed.
*
* @var string
*/
public static $title = 'name';
или, если вам нужно вычислить свойство title из других атрибутов / преобразований:
/**
* Get the value that should be displayed to represent the resource.
*
* @return string
*/
public function title()
{
// You can make advanced transformations/processing of any value here
// $this will refer to the current resource instance.
return $this->name;
}
Это также относится к глобальный поиск.
Ссылки
Laravel Отношение один ко многим: https://laravel.com/docs/6.x/eloquent-relationships#one-ко-многим
Laravel Средства доступа: https://laravel.com/docs/6.x/eloquent-mutators#defining -an-accessor
Свойства нового заголовка ресурса / субтитра: https://nova.laravel.com/docs/2.0/search/global-search.html#title -субтитры-атрибуты