Laravel Eloquent Join Используя другую таблицу - PullRequest
0 голосов
/ 22 февраля 2020

Привет, как преобразовать этот SQL запрос в Laravel Eloquent?
У меня есть три таблицы: платежи, устройства и пользователи. Таблица платежей не хранит user_id. но у таблицы есть device_id. И таблица устройства также имеет user_id.
Я хочу получить имя пользователя, который совершил платеж.

select * from payments p 
join devices d on p.device_id = d.devid
join users u on d.user_id = u.id

1 Ответ

1 голос
/ 23 февраля 2020

это очень просто

$users = \DB::table('payments')
    ->join('devices', 'devices.id', '=', 'payments.device_id')
    ->join('users', 'users.id', '=', 'devices.user_id')
    ->select('payments.*', 'users.name')
    ->get();

Другой способ:

У нас есть три модели:

  1. Пользователь (имеет много устройств )
  2. Устройство (принадлежит пользователю & имеет много платежей)
  3. Платеж (принадлежит устройству)

1) Пользователь. php

<?php

namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;

    public function devices()
    {
        return $this->hasMany(Device::class);
    }

2) Устройство

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Device extends Model
{
    //
    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function payments()
    {
        return $this->hasMany(Payment::class);
    }
}

3) Оплата

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Payment extends Model
{
    //
    public function device()
    {
        return $this->belongsTo(Device::class);
    }
}

и ваш запрос должен быть:

Payament::with(['device','device.user'])->get();
...