Невозможно загрузить отношения модели с Eloquent - PullRequest
1 голос
/ 11 апреля 2020

Для проекта Laravel 7.3, над которым я работаю, у меня есть две таблицы, которые выглядят следующим образом (соответствующая часть):

("prestation" = "performance" in engli sh)

Schema::create('prestations', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    $table->unsignedInteger('prestation_categories_id');
    ...
    $table->timestamps();
});
Schema::create('prestation_categories', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    ...
    $table->timestamps();
});

Вот как я устанавливаю их отношения:

Prestation. php

/**
 * @return BelongsTo
 */
public function categories ()
{
    return $this->BelongsTo('App\PrestationCategory');
}

PrestationCategory. php

/**
 * @return HasMany
 */
public function prestations ()
{
    return $this->hasMany('App\Prestation');
}

Теперь мой Laravel используется в качестве API для SPA, который работает поверх него, и отображает свои данные в JSON. У меня есть страница, предназначенная для отображения всех данных, плюс как минимум два поля категории исполнения. Моя цель - получить строку JSON, которая выглядит следующим образом:

[
  {
    id: 1,
    title: 'Some title',
    description: 'Lorem ipsum sic amet...',
    category: { // or prestation_category, I don't care
      id: 2
      color: '#42B79CFF',
    },
    ...
  },
  {
    ...
  }
]

Однако у меня много проблем с загрузкой этой связанной категории. Я нашел бесчисленные вопросы по этому вопросу, но, как ни странно, ничего не помогло.

Вот как я пытался настроить действие моего контроллера

public function dashboard ()
    {
  // Try #1
  $prestation = Prestation::with('categories:id,color')->get();

  // Try #2
  $prestations = Prestation::with(['categories' => function ($query) {
    $query->select('color', 'whole_day');
  }])->get();

  // Try #3
  $prestations = Prestation::join('prestation_categories', 'prestations.prestation_categories_id', '=', 'prestation_categories.id')->get();

  return response()->json($prestations);
}

Каждый из этих методов возвращает мне мое «Prestation», однако связанная категория не загружена.

Где я сделал ошибку и как ее исправить?

Заранее спасибо

1 Ответ

2 голосов
/ 11 апреля 2020

По умолчанию поле id () схемы миграции имеет большое целое число. Таким образом, чтобы сохранить одинаковое ограничение между связанными таблицами, вы должны использовать одни и те же типы полей.

// prestations
Schema::create('prestations', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    $table->unsignedBigInteger('prestation_categories_id');// pay attention here
    ...
    $table->timestamps();
});

// prestation_categories
Schema::create('prestation_categories', function (Blueprint $table) {
    $table->id();// this field is unsigned big integer
    $table->string('title');
    ...
    $table->timestamps();
});

Примечание: хотя PHP допускает нечувствительность к регистру в именах функций / методов, это assignTo () метод. Попробуйте придерживаться соглашения об именах и передовых методов, описанных здесь , и вы пропустите множество непреднамеренных ошибок.

...