Laravel вывод данных из таблицы по столбцу текущей таблицы

Есть таблица Payments (платежи), структура такая 'id','id_client', 'title', 'payment_type' Как видно она имеет в себе свойство id_client, соответственно id конкретного клиента из таблицы клиентов, чтобы видеть какому клиенту принадлежит платеж и они связаны через hasMany. Необходимо вывести из таблицы Payments все данные, то есть 'id','title', 'payment_type' у которых id_client равен тому, что поступает из url. То есть нужно обратиться к свойствам самой модели. А затем, вместо цифры в 'payment_type' вывести название из связанной таблицы payment_types Так выглядит Роут:

Route::get('client/{client}/payments', 'ApiController@getPaym')->name('api-get-payments');

Контроллер: Тут применяю после where метод first, так как с get() выходит ошибка что метод getPayments не существует Method Illuminate\Database\Eloquent\Collection::getPayments does not exist. Но first() выводит только первую попавшуюся запись, а мне нужны все платежи клиента, то есть все записи где id_client равен определённому числу. Как можно вывести все записи,а не только первую?

public function getPaym($id_client) {
        $match = Payments::where('id_client', $id_client)->first();
        $user = $match->getPayments();
        return view('admin_payment_page', compact('user','match'));
    } 

Метод в модели Payments для связи с типом платежа

public function getPayments(){
        return $this->hasOne('App\Model\Payments_types', 'id', 'payment_type')->get();
        }

Вывод во view

@foreach($user as $el)
    <a href="{{ route('api-get-payments', ['client' => $match->id_client]) }}"></a>
    <tr>     
            <td>{{ $el->name }}</td>
     </tr>
@endforeach  

Соответственно вопросы:

  1. Как вывести все записи с определённым id_client из таблицы Payments,а не только первую попавшуюся?
  2. А потом вывести вместо цифры из поля 'payment_type' название из связанной таблицы payments_types? Подскажите кто знает.

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

Автор решения: Dmitrii Sedov

Решение Вашей проблемы заменить first на get.

выходит ошибка что метод getPayments не существует Method Illuminate\Database\Eloquent\Collection::getPayments does not exist.

Выводит всё правильно. Просто проблема в том, что php не строго типизированный язык, в результате все попросту не отслеживают какой тип данных возвращает тот или иной метод. Если обратить внимание на текст ошибки, вы пытаетесь вызвать метод getPayments из класс Collection. Но откуда он там? он же определён в Вашей модели! (надеюсь поняли в чём проблема)

Решение В $match у вас КОЛЛЕКЦИЯ МОДЕЛЕЙ, а не просто МОДЕЛЬ По суть коллекция тот же массив который можно перебрать либо через цикл либо через встроенные методы. Вам надо написать цикл foreach и у каждого элемента коллекции (то есть модели) вызвать метод ->getPayments(), но это не корректный способ так как будет много запросов sql.

Для решения подобных задач есть метод load() и метод with() можете почитать о них в документации.

Приведу пример с with:

$match = Payments::where('id_client', $id_client)->with('getPayments')->get();

В результате во время перебора match а не user. Уже на фронте внутри будут у каждого элемента значения возвращаемые getPayments и переменная $user уже не нужна. Так как она не будет работать.

UPD

@foreach($match as $el)
    <a href="{{ route('api-get-payments', ['client' => $el->id_client])}}"></a>
    ...
@endforeach 
→ Ссылка