Как получить последнюю запись, используя область Eloquent? - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть таблица Posts, структурированная так:

enter image description here

Теперь я пытаюсь получить последний пост, который, очевидно, является записью с id = 2.

У меня есть это на моей странице темы posts.htm:

[builderList postLatest]
modelClass = "Me\Articles\Models\Posts"
scope = "scopeLatest"
scopeValue = "{{ :scope }}"
displayColumn = "title"
noRecordsMessage = "No records found"
detailsPage = "-"
detailsUrlParameter = "slug"
pageNumber = "{{ :page }}"

в моей модели Posts У меня есть:

public function scopeLatest($query)
{
  return $query->orderBy('created_at','desc')->first();
}

Но этот возвращает обе записи . Я также пытался использовать latest()

return $query->latest();

И этот выводит мне ошибку:

Maximum function nesting level of '1000' reached, aborting!

Даже пытался передать параметр, такой как latest('created_at'), но получил та же ошибка.

Пробный сброс dd($query->orderBy('created_at','desc')->first()->toSql()) и получение select * from posts where posts.deleted_at is null

  1. Почему first() не ограничивается одной записью?
  2. Почему latest() бросает меня Maximum error? Эта версия указывает c ошибка? Кажется, я не могу найти документацию, связанную с этим. У меня Laravel 5.5.48.

Я сейчас не уверен, что я могу использовать. Может я тут что-то не так делаю. Мне просто нужно получить последнее сообщение.

1 Ответ

1 голос
/ 07 апреля 2020

Решением вашей проблемы является использование метода ->take(1) . Есть еще методы, применимые к запросам, но вот список доступных методов , которые вы можете запустить на экземпляре коллекции. Я полагаю, что Builder ожидает, что области вернут запрос {[a collection of models]}. Я потратил некоторое время на тестирование, и, по моему мнению, это может быть просто недостатком в конструкции Плагин Builder.

Теперь, прежде чем вы посмотрите на мое исследование ниже. Я бы сказал, что вы должны научиться создавать свои собственные компоненты , как предлагает Хардик в комментарии. Надеюсь, что все это поможет.

Итак, вот область, которую я имею для плагина:

public function scopeFilterTypes($query) {
    return $query->whereNotIn('slug', [
        'range', 
        'close',
        'all', 
        'single',
        'three',
        'five',
        'self'
        ])->first();
}

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

enter image description here

Теперь посмотрите на это изображение компонента моего компоновщика. Вы можете видеть, что он даже игнорирует мой ->whereNotIn([]) метод по запросу:

enter image description here

Чтобы доказать мои выводы об этом недостатке в компоненте компоновщика, я делаю метод find($id), который возвращает экземпляр модели не коллекция моделей. Использование метода find($id) также дает мне правильный результат в форме бэкэнда, но в списке Builder отображаются все записи, которые являются неправильными.

Однако, когда я изменяю область действия на ->take(1):

public function scopeFilterTypes($query) {
    return $query->whereNotIn('slug', [
        'range', 
        'close',
        'all', 
        'single',
        'three',
        'five',
        'self'
        ])->orderBy('created_at','desc')->take(1);
}

Я получаю это в форме бэкэнда; работает правильно: enter image description here

И я получаю это из списка строителей:

enter image description here

...