У меня есть две таблицы. Один - устройство, а другой - 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, но это хороший обходной путь. Локальная область не была полезна для моей проблемы (если вам нужно проверить на ноль, она не будет работать).