Отношения Laravel, выберите следующую ранжированную строку из базы данных.

У меня есть связанные элементы в моей базе данных. Я выбрал все элементы из базы данных по соответствующему идентификатору:

$next_stock = $this->model->get()->where('part_id', $in_data['part_id'])->all();

и я собираю строки, сгруппированные по одному конкретному идентификатору, как на картинке. Все они выбраны по «part_id»:

Выбор элементов

сгруппировано по одному идентификатору

Также с помощью этой строки кода я могу выбрать один из элементов из этой коллекции:

$next_stock = $this->model->get()->where('id', $old_stock['id'])->where('part_id', $in_data['part_id'])->first();

Но как я могу выбрать следующие элементы после этого? Или как я могу выбрать второй или третий предмет из этой коллекции?

Я не могу просто увеличить номер идентификатора на единицу сначала, потому что иногда идентификаторы этого элемента не следуют друг за другом.


person bohdan baida    schedule 23.03.2017    source источник
comment
почему бы вам не использовать get() вместо first и loop в результатах.   -  person Amr Aly    schedule 23.03.2017


Ответы (2)


Имея коллекцию, можно взять конкретный элемент в позиции с комбинацией take() и last().

$collection = $this->model->get()->where('part_id', $in_data['part_id'])->all();
$second = $collection->take(2)->last(); //if this doesnt work, do it in 2 steps
$third  = $collection->take(3)->last(); //if this doesnt work, do it in 2 steps

Если у вас нет коллекции, возьмите прямо из базы данных, как это

$second = $this->model
->where('part_id', $in_data['part_id'])
->skip(1)
->first(); 

Если это не работает с first()

$collect = $this->model
->where('part_id', $in_data['part_id'])
->skip(1)
->take(1)
->get();

$second = $collect->first();

Изменить

skip() и take() на самом деле являются частью построителя запросов, а не красноречивой модели. Так что это не будет работать с Eloquent в Laravel 5.4.

Попробуйте с

$collect = $this->model
->where('part_id', $in_data['part_id'])
->get(1); //For the second record, 0 being the first
person EddyTheDove    schedule 23.03.2017
comment
Выдает ошибку: Метод пропуска не существует. или: вызов функции-члена take() для массива - person bohdan baida; 23.03.2017
comment
Пропуск существует только в Eloquent. Поэтому вы должны использовать Eloquent как $collect = Model::where()->skip()->take()->get(); Я понятия не имею, что означает this->model - person EddyTheDove; 23.03.2017
comment
Это относится к модели Price. public function __construct(Price $price, Inventory $inventory) { $this->model = $price; $this->inventory = $inventory; } - person bohdan baida; 23.03.2017
comment
Хорошо, чтобы это работало, используйте Price::where()... вместо this-›model. Поскольку передаваемая вами модель уже является объектом, ее нельзя отфильтровать. Вы можете использовать эти методы только в коллекциях. - person EddyTheDove; 23.03.2017
comment
Изменил, выдает ту же ошибку, для обоих методов skip() и take() как и было раньше. - person bohdan baida; 23.03.2017
comment
skip() и take() на самом деле являются частью построителя запросов, а не красноречивой модели. Так что это не будет работать с Eloquent. - person EddyTheDove; 23.03.2017
comment
Хорошо, проверьте мое последнее редактирование. К сожалению, это будет мой последний вклад на сегодня. В Сиднее 2 часа ночи. Если это все еще не работает, перейдите по этой ссылке и попробуйте различные варианты функций, которые они предлагают, чтобы увидеть, сможете ли вы заставить их работать. laravel.com/docs/5.4/collections - person EddyTheDove; 23.03.2017
comment
Большое спасибо @EddyTheDove, теперь все работает. Вот строки, которые я искал $price_collection = $this->model->get()->where('part_id', $in_data['part_id']); $next_stock = $price_collection->take(2)->last(); Вы помогли решить мою проблему. - person bohdan baida; 23.03.2017

Если вы еще этого не делаете, вам следует установить отношения вашей модели. Например. Если вы используете «один ко многим», Eloquent автоматически определит для вас правильный столбец внешнего ключа в модели.

$parts = App\Stock::find(1)->partId;

foreach ($parts as $part) {
    //
}
person Jurgen Schmidt    schedule 23.03.2017