Laravel как связать 2 таблицы для получения данных первой по id другой таблицы

Всем привет. Допустим есть 2 таблицы - clients и payments. У клиента может быть много платежей, потому тут в моделях у нас связь hasMany. А как сделать так, чтобы по id клиента указанного в url (допустим url такой /get/client/{client}/payments, тут id клиента помещается в {client}) можно было получить все платежи конкретного клиента (ясно дело id характеризует конкретного клиента). Прошу пожалуйста подсказать кто знает как это реализовать.


Ответы (1 шт):

Автор решения: Walfter

В целом вы же получаете клиента можете работать с платежами напрямую из метода например

public function payments(App\Models\Client $client) 
{
    return response()->json(['success' => true, 'payload' => ['payments' => $client->payments]]);
}

Но это если у вас подобная связь

clients:

  • id
  • other

payments

  • id
  • client_id
  • other

и соответственно в моделях

// App\Models\Client
public function payments(): HasMany
{
    return $this->hasMany(Payments::class);
}

// App\Models\Payment
public function client(): BelongsTo
{
    return $this->belongsTo(Client::class);
}

То собственно у вас уже есть все связи между платежами и клиентами то есть вы можете вытаскивать как платежи выбранного клиента так и клиента у конкретного платежа... Но ещё вы можете сделать скопу

// App\Models\Payment
public function scopeByClientId(Illuminate\Database\Eloquent\Builder $builder, int $client_id): Illuminate\Database\Eloquent\Builder
{
    return $builder->where('client_id', $client_id);
}

И теперь что бы получить платежи по id клиента достаточно попросить их Payment::byClientId($client_id)->get()

→ Ссылка