Laravel - Расширить отношения с orderBy не работает должным образом

У меня есть такой код:

$query = $platform->challenges();
// return response()->json($query);
$challenges = $query->orderBy('start_date', 'DESC')->get();
return response()->json($challenges);

Как видите, я получаю построитель запросов отношений задач и пытаюсь упорядочить результаты по дате. Если я раскомментирую вторую строку, я получу массив из 2 элементов. Но если я добавлю orderBy к построителю, я получу только 1 массив элементов.

Что-то мне не хватает?

РЕДАКТИРОВАТЬ

Код модели:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use GeneaLabs\LaravelModelCaching\Traits\Cachable;

class Platform extends Model
{
    use Cachable;

    protected $fillable = ['name', 'connection_key', 'code', 'enabled'];

    public function brands()
    {
        return $this->hasMany('App\Models\Brand');
    }

    public function challenges()
    {
        return $this->hasMany('App\Models\Challenge');
    }
}

Может быть, здесь плохое поведение вызвана особенностью cachable?

вы можете поделиться своим кодом здесь?

MONSTEEEER 09.01.2019 11:00

Это весь код метода контроллера ... или вам тоже нужна модель?

Javier Torron Diaz 09.01.2019 11:06

не могли бы вы, пожалуйста?

MONSTEEEER 09.01.2019 11:11

да @LordVermi, также поделитесь кодом вашей модели ...

Prathamesh Doke 09.01.2019 11:13

Я только что добавил код модели

Javier Torron Diaz 09.01.2019 11:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
5
1 405
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Попробуйте это (используя полученные коллекции):

$challenges = $platform->challenges->sortByDesc('start_date');
return response()->json($challenges);

Или это (с построителем запросов):

$platform->disableCache(); 
$challenges = $platform->challenges()->orderBy('start_date')->get();

ИЗ ДОКУМЕНТОВ:

Ручная промывка конкретной модели

Вы можете очистить кеш определенной модели, используя следующую команду artisan:

php artisan modelCache:clear --model=App\Model

Это удобно при внесении обновлений в базу данных вручную. Вы также можете активировать это после внесения обновлений в базу данных из источников за пределами вашего приложения Laravel.

Это, конечно, работает, но есть проблема. Он добавляет индекс к каждому элементу в массиве ["0": {...}, "1": {...}]. Несмотря на то, что это работает, я пытаюсь понять, почему построитель запросов не работает должным образом, ваше решение работает с окончательной коллекцией и сортировкой массивов.

Javier Torron Diaz 09.01.2019 11:14

Если вы подозреваете, что это система кеширования, сначала отключите ее для этого конкретного запроса: $challenges = $platform->disableCache()->challenges()->orderBy('start_date‌​', 'DESC')->get();.

andcl 09.01.2019 11:25

Вы правы, я только что сделал, и это тоже работает. Возможно, мне нужно очистить кеш перед вызовом этого API.

Javier Torron Diaz 09.01.2019 11:28
Call to undefined method GeneaLabs\LaravelModelCaching\CachedBuilder::challenges()
Javier Torron Diaz 09.01.2019 11:30

Это код, добавьте его в свой ответ $platform->disableCache(); $query = $platform->challenges(); $challenges = $query->orderBy('start_date')->get();

Javier Torron Diaz 09.01.2019 11:33

Добавил к ответу;)

andcl 09.01.2019 11:35

Нет необходимости болтать, все готово и работает, спасибо большое.

Javier Torron Diaz 09.01.2019 12:19

Попробуй это ..

$query = $platform->challenges();
$challenges = $query->orderBy('start_date', 'DESC')->get();
return json_encode($challenges);

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

Javier Torron Diaz 09.01.2019 11:24

у вас есть столбец с именем "start_date", если нет, почему бы не сделать что-то вроде этого

$challenges = $query->orderBy('created_at', 'DESC')->get();

поскольку у вас уже есть столбец created_at

Другие вопросы по теме