Laravel + Eloquent ORM: HasManyThrough OrderBy TableC.column2

Posted

技术标签:

【中文标题】Laravel + Eloquent ORM: HasManyThrough OrderBy TableC.column2【英文标题】: 【发布时间】:2016-08-21 22:59:00 【问题描述】:

表 A = 库存 |表 B = ItemAssociation |表 C = ItemValue

我有表 A、B 和 C。A 和 B 是一对一的关系,B 和 C 是一对一的关系。我目前正在使用 HasManyThrough 关系来达到这个目的:

public function item()
    return $this->hasManyThrough('App\ItemValue','App\ItemAssociation','id','id');

在我的控制器中:

public function orm()
    $inventory = Inventory::getAssocBySteamID(76561198124900864)->get();
    $i = 0;
    foreach($inventory as $inv)
        $this->data[$i] = $inv->item()->get();
        $i++;
    
    return $this->data;

在哪里 Inventory::getAssocBySteamID:

public static function getAssocBySteamID($id)
    return SELF::where('steamid64','=',$id);

这将返回我需要的所有数据,但是,我需要按表 C 中的一列,即 ItemValue 模型对其进行排序。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您可以在 getAssocBySteamID 函数中添加 ->orderBy('TableName', 'desc')。 或者到 ->get() 之前的 Orm() 函数中的查询

对于 Eloquent 的 QB 中的 Where 子句,您也不需要“=”符号。你可以做 where('steamid',$id)

【讨论】:

【参考方案2】:

不要使用静态函数使用范围。尝试使用这样的连接查询:

// Inventory model method
public function scopeAssocBySteamID($query, $id) 
    $query->where('steamid64', $id)
        ->join('ItemValue'. 'ItemValue.id', '=', 'Inventory.ItemValue_id')
        ->select('Inventory.*')
        ->orderBy('ItemValue.item_price')

然后:

public function orm()
    $inventory = Inventory::assocBySteamID(76561198124900864)->get();
    $i = 0;
    foreach($inventory as $inv)
        $this->data[$i] = $inv->item()->get();
        $i++;
    
    return $this->data;

在测试此示例之前检查所有表和字段名称。

【讨论】:

这行得通,谢谢!但是,它仍然没有按表 C (ItemValue) 中的 item_price 列排序。 我把它放在上面的编辑中。检查你是否拥有它:->orderBy('ItemValue.item_price') 还是不行……它改变了顺序,但是和ItemValue.item_price没有任何关系……奇怪 好的,你能给我看几个 item_price 的例子,告诉我这个字段在数据库中是什么类型吗? 看这里:screenshot,它是数据库中的一个数值:average_price NUMERIC(8,2),

以上是关于Laravel + Eloquent ORM: HasManyThrough OrderBy TableC.column2的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent ORM--整理(未转)

Laravel Eloquent ORM 似乎很简单

Laravel 插入嵌套的 Eloquent ORM 模型

Laravel Eloquent ORM 复制

Laravel之Eloquent ORM

Laravel Eloquent ORM 事务