Laravel: поле отношений orderBy - PullRequest
0 голосов
/ 08 июня 2018

У меня проблема с моделью упорядочения по последнему объектному полю этого отношения.

У меня есть класс с именем Coin, который связан с DailyPrices, что в 1 монете может быть много DailyPrices.Я хочу отсортировать монеты по последнему полю DailyPrices с именем vol.

Я пытался сделать

$coins = Coin::join('daily_prices', 'daily_prices.coin_id', '=', 'coins.id') ->orderBy('daily_prices.vol', 'desc') ->paginate(100);

и много вариантов об этом, но не могу получитьэто на работу.Что я делаю не так?

Ответы [ 5 ]

0 голосов
/ 27 июня 2018

Может быть, вопрос был неясен, я не знаю.Но ни один из них не имел отношения к проблеме.Я решил проблему с этим запросом:

SELECT c.* FROM daily_prices AS dp JOIN coins AS c ON dp.coin_id=c.id WHERE dp.id IN (SELECT MAX(id) FROM daily_prices GROUP BY coin_id) ORDER BY vol DESC

и преобразован в вызов laravel:

 Coin::join('daily_prices', 'daily_prices.coin_id', '=', 'coins.id')
                ->whereIn('daily_prices.id', function ($query) {
                    $query->selectRaw('MAX(id)')
                        ->from('daily_prices')
                        ->groupBy('coin_id');
                })
                ->orderBy('daily_prices.vol', 'desc')
                ->paginate(100);
0 голосов
/ 08 июня 2018

Вы допустили две ошибки в своем коде:

  • Проверка состояния
  • Не выбирать таблицу

Вот код после внесения изменений:

$order='desc';
Coin::join('daily_prices', 'coins.id', '=', 'daily_prices.coin_id')->orderBy('daily_prices.vol', $order)->select('coins.*')->paginate(100);

Более подробную информацию вы также можете найти здесь: Сортировать по связям

0 голосов
/ 08 июня 2018

Вы можете использовать Отношение «один ко многим» :

class Coin {

    public function dailyPrices() {
        return $this->hasMany(DailyPrice::class);
    }

}

DailyPrice:

class DailyPrice {

    public function coin() {
        return $this->belongsTo(Coin::class);
    }

}

Затем в контроллере:

Coin::with('dailyPrices' => function ($query) {
    $query->orderBy('vol', 'desc');
))->paginate(100);

Функция with загрузит отношение dailyPrice для вашего элемента, а аргумент value выполнит запрос, связанный с загруженным отношением (здесь порядок по).

Надеется, что это поможет вам.

0 голосов
/ 08 июня 2018

Вы можете создать две отдельные модели для монет и суточной цены.

class Coin extends Model {
    public function dailyPrices(){
        return $this->hasMany('App\DailyPrice')->orderBy('vol', 'DESC');
    }
}
class DailyPrice extends Model {

    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'daily_prices';
    /**
     * Get the coin that owns the daily price.
     */
    public function coin()
    {
        return $this->belongsTo('App\Coin');
    }
}

и звонить с идентификатором в вашем контроллере следующим образом:

$coinData = Coin::find($coin_id)->with('dailyPrices')->first();
0 голосов
/ 08 июня 2018

почему бы вам не использовать create_at вместо vol

$coins =  Coin::join('daily_prices', 'daily_prices.coin_id', '=', 'coins.id')->order_by('created_at', 'desc')->paginate(100);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...