Возврат данных из другой модели в Laravel / Laravel Nova - PullRequest
0 голосов
/ 07 февраля 2020

Мой вопрос:

В Laravel Нова, как я могу отобразить название страны на основе идентификатора страны?

I есть 2 таблицы:

  1. страны
  2. страны_цены

  1. страны таблицы содержит id, name et c ..
  2. таблица_стран страны содержит id, country_id, country_price

Модели: (Laravel & Nova)

В модели страны (Laravel):

    public function countryPrice() {
        return $this->hasOne('App\\CountryPrice');
    }

В модели цены в стране (Laravel):

    public function countries()
    {
        return $this->hasMany('App\Country', 'id', 'country_id');
    }

В модели страны (Nova):

HasOne::make('CountryPrice'),

В модели CountryPrice (Nova):

HasMany::make('Countries'),

Что я пытаюсь:

В модели CountryPrice (Laravel)

    public function getCountryName() {
        return Country::where('id', $this->country_id)->first()->name;
    }

В модели CountryPrice (Nova)

    public function fields(Request $request)
    {
        return [
            ID::make()->sortable(),
            ID::make('Country ID','country_id'),

// TRYING TO PULL IN COUNTRY NAME HERE
            Text::make('Country Name', function () {
                $countryName= $this->getCountryName;
                return $countryName;
            }),

            Text::make('Base Price', 'trip_cost'),
            HasMany::make('Countries'),
        ];
    }


Моя ошибка:

App \ CountryPrice :: getCountryName Должен возвращать экземпляр отношения


Я не понимаю ошибку и нуждаюсь в помощи, чтобы заставить это работать. Любая помощь будет оценена.

1 Ответ

1 голос
/ 07 февраля 2020

Обновления на основе ваших комментариев

Похоже, у вас есть отношения один к одному между 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 -субтитры-атрибуты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...