Как получить результаты с условием «где» в «Ресурсе нити»

Я использую Laravel Filament (3.0) и создал модель Resource for Court, которая отлично работает.

У меня есть поле role_id в таблице профилей, связанное с идентификатором в таблице ролей, и поле Court_id в отношениях таблицы профилей с идентификатором в таблице суда.

Мне нужно отобразить атрибут Profile.name в столбце «Судья» на ресурсе суда, где Court_id = идентификатор суда строки и role_id = 4

Могу ли я добавить условие в нити, чтобы получить это?

Таблица ресурсов суда

return $table
      ->columns([
        Tables\Columns\TextColumn::make('name')
          ->label('Court Name')
          ->searchable(),
        Tables\Columns\TextColumn::make('profile.fullname')
          ->label('Judge')
          ->sortable(),
      ])

Модель Суда

 public function profile()
  {
    return $this->belongsTo(Profile::class);
  }

ПрофильМодель

public function court()
  {
    return $this->hasOne(Court::class);
  }

  public function role()
  {
    return $this->hasOne(Role::class);
  }

РолеваяМодель

  public function profile()
  {
    return $this->belongsToMany(Profile::class);
  }
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
0
467
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, убедитесь, что ваши отношения правильно настроены в ваших моделях.

Профили, вероятно, принадлежат Двору и Роли, а не наоборот.

ProfileModel

public function court()
{
    return $this->belongsTo(Court::class, 'court_id');
}

public function role()
{
    return $this->belongsTo(Role::class, 'role_id');
}

CourtModel

public function profiles()
{
    return $this->hasMany(Profile::class, 'court_id');
}

RoleModel

public function profiles()
{
    return $this->hasMany(Profile::class, 'role_id');
}

Теперь, чтобы отобразить profile.name, где role_id = 4 и Court_id соответствуют идентификатору суда в строке, вам, вероятно, потребуется создать специальный столбец, который вычисляет значение на лету. Вы можете использовать пользовательский метод доступа к модели Court или вычисляемый столбец непосредственно в ресурсе Filament.

Add a method to the Court model to get the judge's name:

public function getJudgeNameAttribute()
{
    $judge = $this->profiles()->where('role_id', 4)->first();
    return $judge ? $judge->name : 'No Judge Assigned';
}

Затем используйте этот метод доступа в таблице Filament:

return $table
    ->columns([
        Tables\Columns\TextColumn::make('name')
            ->label('Court Name')
            ->searchable(),
        Tables\Columns\TextColumn::make('judge_name')
            ->label('Judge')
            ->sortable(),
    ]);

Or you can also do,

Определите вычисляемый столбец непосредственно в ресурсе Filament, не изменяя модель:

return $table
    ->columns([
        Tables\Columns\TextColumn::make('name')
            ->label('Court Name')
            ->searchable(),
        Tables\Columns\TextColumn::make('profiles')
            ->getStateUsing(fn ($record) => $record->profiles()->where('role_id', 4)->first()->name ?? 'No Judge Assigned')
            ->label('Judge')
            ->sortable(),
    ]);

Большое спасибо, я не был уверен, можно ли это сделать прямо в ресурсе или нужно было через модель. Оба решения верны. Мне просто пришлось изменить имя метода в функции Profiles на Profile, поскольку в модели он называется именно так. Теперь я могу создавать больше подобных функций, используя метод getStateUsing. Большое вам спасибо.

Coder Dev 04.05.2024 06:17

Никаких проблем, рад помочь вам.

Khayam Khan 04.05.2024 10:11

Другие вопросы по теме