Laravel:orderBy关系的领域

时间:2018-06-08 11:07:20

标签: mysql laravel

我有一个问题,就是按照它的关系最新的对象字段来订购模型。

我有一个名为Coin的类与DailyPrices相关,1个硬币可以有许多DailyPrices。我想通过名为vol的最新DailyPrices字段对硬币进行排序。

我试过

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

以及它的许多变化,但我不能让它发挥作用。我做错了什么?

5 个答案:

答案 0 :(得分:0)

为什么不使用created_at而不是vol

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

答案 1 :(得分:0)

您可以使用One to Many relationship

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函数将在item上加载dailyPrice关系,value参数将执行与加载的关系相关的查询(此处为order by)。

希望它可以帮到你。

答案 2 :(得分:0)

您可以为硬币和每日价格创建两个单独的模型。

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');
    }
}

并在控制器中使用ID调用

$coinData = Coin::find($coin_id)->with('dailyPrices')->first();

答案 3 :(得分:0)

你在代码中犯了两个错误:

  • 条件检查
  • 不选择表格

以下是进行更改后的代码:

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

您还可以在此处查看更多详细信息:Order by on relationship

答案 4 :(得分:0)

也许这个问题不清楚,我不知道。但是这些都与一个问题无关。我已经通过以下查询解决了该问题:

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);