Запрос на получение предыдущего элемента, связанного с идентификатором в Laravel Eloquent - PullRequest
1 голос
/ 12 марта 2019

У меня есть две таблицы. Один - устройство, а другой - POS во многих отношениях. Мне нужно получить все устройства с идентификатором POS, который я ищу, но получить предыдущее устройство, а не последнее. Я хочу использовать его как функцию в моей модели, чтобы иметь легкий доступ к этому элементу на устройстве.

Device
--------
- id
- other elements 
- pos_id
- function to get the previous device for the above pos_id

POS
--------
- id
- other stuff

Devices_pos
----------
- device_id
- pos_id

Я знаю, что могу получить доступ к $ pos-> устройствам и получить все элементы.

Я пробовал:

public function scopePrev_dev_pos()
    {
        if ($this->pos_id > 0){
            $pos = Pos::find($this->pos_id);
            return $pos->devices->where('device_id', '<', $this->id)->max('device_id');
        } else {
            return null;
        }

    }

Все, что он мне дает, это Eloquent Builder, у которого, очевидно, нет ничего внутри.

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

SELECT MAX(device_id) FROM devices_pos
WHERE pos_id = 7
AND device_id < 7035;

... но с использованием Eloquent. идентификаторы являются только примером.


РЕДАКТИРОВАТЬ: Завершено с помощью аксессора:

public function getPreviousDeviceAttribute()
    {
        if ($this->pos_id > 0){
            $pos = Pos::find($this->pos_id);
            $prev = DB::table('devices_pos')->where('device_id', '<', $this->id)
                    ->where('pos_id', $this->pos_id)
                    ->max('device_id');
            $device = Device::find($prev);
            return $device;
        } else {
            return null;
        }

    }

Я оставляю вопрос открытым, потому что я использую фасад, а не Eloquent, но это хороший обходной путь. Локальная область не была полезна для моей проблемы (если вам нужно проверить на ноль, она не будет работать).

1 Ответ

1 голос
/ 12 марта 2019

Попробуйте это должно работать

$pos->devices()->newPivot()->where([ ['device_id', '<', $this->id], ['pos_id','=', $this->pos_id] ])->max('device_id');

Или вы можете использовать

DevicePos::where([
    ['device_id', '<', $this->id],
    ['pos_id','=', $this->pos_id]
])->max('device_id');

см. Связанный https://laravel.com/docs/5.5/queries#aggregates

Пример с DB фасадом

DB::table('devices_pos')->where([
        ['device_id', '<', $this->id],
        ['pos_id','=', $this->pos_id]
    ])->max('device_id');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...