我有一个问题,就是按照它的关系最新的对象字段来订购模型。
我有一个名为Coin的类与DailyPrices相关,1个硬币可以有许多DailyPrices。我想通过名为vol
的最新DailyPrices字段对硬币进行排序。
我试过
$coins = Coin::join('daily_prices', 'daily_prices.coin_id', '=', 'coins.id')
->orderBy('daily_prices.vol', 'desc')
->paginate(100);
以及它的许多变化,但我不能让它发挥作用。我做错了什么?
答案 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);