Laravel отличается от одного до многих - PullRequest
0 голосов
/ 04 июня 2018

Я нашел пару вопросов в Интернете, похожих на мой, но мне не удается найти рабочий ответ.

У меня есть 2 таблицы

ПОЛЬЗОВАТЕЛЬ

ID | FIRSTNAME  | EMAIL_ADDRESS
1  | Joe Bloggs | Joe@bloggs.com

СОСТОЯНИЕ

ID | USER_ID | STATUS | DATE
1  |  1      | 'In'   | 2018-06-04 09:01:00
2  |  1      | 'Out'  | 2018-06-04 09:00:00

Мне нужно иметь возможность объединить две таблицы вместе, но получить только самый последний столбец состояния можно по date,как это

ID | FIRSTNAME  | EMAIL_ADDRESS    | STATUS_ID | STATUS | DATE
1  | Joe Bloggs | Joe@bloggs.com   | 1         | 'In'   | 2018-06-04 09:01:00

Мне нужно иметь возможность запускать дополнительные аргументы построителя запросов, такие как where, потому что у пользователя есть возможность передавать фильтры и параметры поиска, если они требуются, чтобы иметь возможность использоватьстолбцы таблицы состояния в моем конструкторе запросов, я делаю объединение, как это

$users = Users::join('status', 'status.user_id', '=', 'user.id')->distinct('user.id');

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

         if(!empty($request->search)){
             $param = $request->search;
             $users = $users->where(function($query) use ($param){
                 $query->where('users.firstname', 'like', '%'.$param.'%')
                       ->orWhere('users.email_address', 'like', '%'.$param.'%');
             });
         }
         if(!empty($request->dateFrom)){
             if(!empty($request->dateTo)){
                 $users = $users->whereRaw('DATE(status.date) BETWEEN ? AND ?', [$request->dateFrom, $request->dateTo]);
             } else {
                 $users = $users->whereRaw('DATE(status.date) BETWEEN ? AND DATE(NOW())', [$request->dateFrom]);
             }
         }

Затемзапустите мой get() в конце

    if($method == 'paginate'){
        $users = $users->paginate(10);
    } else {
        $users = $users->get();
    }

Это вернет следующее

ID | FIRSTNAME  | EMAIL_ADDRESS    | STATUS_ID | STATUS | DATE
1  | Joe Bloggs | Joe@bloggs.com   | 1         | 'In'   | 2018-06-04 09:01:00
2  | Joe Bloggs | Joe@bloggs.com   | 1         | 'Out'  | 2018-06-04 09:00:00

Мне нужно иметь возможность использовать столбцы сторонней таблицы в качестве аргументов в моих Where функциях,но мне нужно только вернуть 1 строку на пользователя.Как запустить объединение, но вернуть только 1 строку для каждого из моих пользователей?

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Поскольку вы используете Laravel, давайте сделаем решение немного более понятным и простым: сначала давайте создадим модели для каждой таблицы:

class User extends Model
{
    public $timestamps = false;

    protected $fillable = [
       'FIRSTNAME', 
       'EMAIL_ADDRESS'
    ];

    public function status(){
    return $this->hasMany(\App\Status::class);
}
}

Теперь давайте создадим модель состояния:

class Status extends Model
{
    public $timestamps = false;

    protected $casts = [
        'USER_ID' => 'int',
    ];

    protected $fillable = [
        'USER_ID',
       'STATUS',
        'DATE'
    ];

    public function user()
    {
        return $this->belongsTo(\App\User::class);
    }
}

Теперь вы можете использовать Eloquents следующим образом:

 $result=User::whereHas('Status', function($q){
    $q->where('date', $current_date);
})->distinct('id')->get();

Надеюсь, это поможет!

0 голосов
/ 04 июня 2018

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

select u.*,s.*
from user u
join status s on u.id  = s.user_id
left join status s1 on s.user_id = s1.user_id 
and s.date < s1.date 
where s1.user_id is null

Используя построитель запросов, вы можете переписать ее как

DB::table('user as u')
  ->select('u.*', 's.*')
  ->join('status as s', 'u.id ', '=', 's.user_id')
  ->leftJoin('status as s1', function ($join) {
        $join->on('s.user_id', '=', 's1.user_id')
             ->whereRaw(DB::raw('s.date < s1.date'));
   })
  ->whereNull('s1.user_id')
  ->get();

Laravel Eloquentвыбрать все строки с максимальным значением create_at

Laravel - Получить последнюю запись каждого типа UID

Группа Eraquent Laravel по самой последней записи

...