DISTINCT в выпуске laravel ELOQUENT - PullRequest
1 голос
/ 25 мая 2020

В моем приложении laravel у меня есть две таблицы с именами apps и app_payments. Я хотел объединить две таблицы и сделал это, как указано в приведенном ниже laravel ELOQUENT. В объединенной таблице у меня есть один столбец для хранения идентификаторов пользователей (user_id). Следующий ELOQUENT возвращает мне несколько строк для определенного пользователя

$sites=DB::table('app_payments')
        ->join('apps', 'app_payments.app_id', '=', 'apps.appId')
        ->select('app_payments.*', 'apps.*')
        ->where ('apps.appId','=',$id)
        ->get();
return view('payments.show',compact('sites'))
            ->with('i', (request()->input('page', 1) - 1) * 100); 

Но мне нужно выбрать только одну строку для одного (указанного c) идентификатора пользователя, я знаю, что мне, возможно, придется использовать DISTINCT, но, борясь использовать его в этом laravel ELOQUENT.

Как я могу изменить вышеупомянутый ELOQUENT, чтобы добиться этого?

1 Ответ

1 голос
/ 25 мая 2020

В опубликованном вами коде используется Query Builder (DB::table('app_payments')->...), а не Eloquent (AppPayment::where(...)->...->get())

Какова ваша цель эти таблицы? Продолжая делать это с помощью Query Builder напрямую или с Eloquent, расширяя Query Builder?

В Eloquent вы должны установить отношения между приложением и платежами в Модели:

public function app()
{
  $this->belongsTo(App::class, 'appId');
}
public function user()
{
  $this->belongsTo(User::class);
}

Что-то вроде

AppPayment::where('appId', $id)->with(['app', 'user'])->get()

вернет все Платежи с соответствующим Приложением и Пользователем.

Конечно, если вы ожидаете получить только один платеж на пользователя, это еще не произойдет. сделать работу. Для меня это звучит так, будто вам лучше запросить наоборот, но это решение зависит от того, какие данные вам действительно нужны.

Для последнего платежа это будет примерно так:

// App\Models\User.php
...
public function payments()
  return $this->hasMany(AppPayment::class)
    ->with(['app'])
    ->orderByDesc('created_at');
...

// query anywhere
$users = User::with(['payments', 'payment.app'])
  ->whereHas('payments', function (Builder $query) use($app_id){
    $query->where('app_id', $app_id);
  })
  ->get()

// latest payment:
foreach($users as $user){
  $latestPayment = $user->payments[0];
  ...
}

Код не проверен ... И все еще нужен трюк, чтобы получить только (!) Последний платеж специального c приложения, я потерял эту точку из виду ...

...