ZetIndex_Ram
@ZetIndex_Ram

Lazy loading resource in Laravel, если метод у модели не возвращает отношение?

В Laravel для ApiResource есть прекрасная функция $this->whenLoaded для ленивой загрузки отношений у модели https://laravel.com/docs/8.x/eloquent-resources#co....

У меня такая проблема, что у меня есть свойство у модели, которое не возвращает отношение, а идет к другой таблице в базе данных, собирает квартиры по определенному условию и складывает это всё в массив (дизайнер PhpMyAdmin внизу)

607946f1edad0909707317.png

В данном случае у меня есть адреса и квартиры в них хранятся у пользователей в отдельном поле (ну чтобы адресов сильно много не плодить, у нас тим лид сказал, что так правильно делать и мы так делаем, я токо Junior и пока еще учусь ¯\_(ツ)_/¯)

Код для взятия квартир рабочий и выглядит следующим образом

Address.php

public function apartments() {
  return $this->clients->map(function ($item) {
      return $item->apartment;
  })->sort()->flatten();
}


Я хочу в AdressResource сделать так, чтобы лениво подгружалось также через with(или как-то по другому, ну чтобы механизм подгрузки при обращении Adresss:with('apartments')->get()) был примерно таким (но это естественно не работает).

class Address extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            "id" => $this->id,
            "city" => $this->ctiy,
            "street" => $this->address,
            "house" => $this->house,
            $this->corpus ?? "corpus" => $this->corpus,
           ?? вот эта строчка нужно чтобы была ленивой, но я не могу придумать логику --> "apartments" => $this->apartments()
        ];
    }
}


P.S. связь многие ко многим предполагается, что офис будет обслуживать много адресов и тут я думаю сделать связь всё-таки один ко многим. Тут как бы офисы есть и одна пачка адресов относится к одному офису, а другая пачка к другому (ну короче как в почте, типо одни адреса туда, а другие сюда).
  • Вопрос задан
  • 197 просмотров
Решения вопроса 1
Vadiok
@Vadiok
Веб разработчик
apartments() описываете через hasManyThrough. Если возможностей стандартного hasManyThrough не хватает, можете использовать пакет eloquent-has-many-deep.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы