Yii2:从 hasMany 关系中选择最后一条记录

far*_*ete 4 php mysql yii2 yii2-advanced-app

我对 mysql 的了解非常基础,现在我面临一个“复杂”(对我来说)的查询,我被困在其中,所以如果有人能给我一些启示,请提前感谢您。

我有三张表:

订单

id | name | comments | ...
Run Code Online (Sandbox Code Playgroud)

订单行

id | name | sDate | eDate | comments | ...
Run Code Online (Sandbox Code Playgroud)

订单行统计信息

id | lineID | date | status | ...
Run Code Online (Sandbox Code Playgroud)

每天 OrderLinesStats 都会通过 cron 作业更新,并获取包含实际日期、状态和其他字段的新记录,因此最高 id 是实际数据。

我试图在 yii2 中获取最后一个 stats 行,如下所示:

在 OrdersLines 模型中:

public function getLastOrdersLinesStats()
{
    return $this->hasMany(OrdersLinesStats::className(), ['lineID' => 'id'])
        ->orderBy(['id'=>SORT_DESC])
        ->groupBy('lineID');
}
Run Code Online (Sandbox Code Playgroud)

订单型号:

public function getOrdersLines()
    {
        return $this
            ->hasMany(OrdersLines::className(), ['orderID' => 'id'])
            ->orderBy(['typeID' => SORT_ASC, 'name' => SORT_ASC])
            ->with(['lastOrdersLinesStats']);
    }
Run Code Online (Sandbox Code Playgroud)

但是当我调试查询时,它看起来像这样:

SELECT * FROM `ordersLinesStats` WHERE `lineID` IN (1873, 1872, 1884, 1883, 1870, 1874, 1876, 1880, 1871, 1877, 1881, 1882, 1885, 1886, 1869, 1875, 1878) GROUP BY `lineID` ORDER BY `id` DESC
Run Code Online (Sandbox Code Playgroud)

并且没有给我每一行的最后一个统计记录......事实上,它给了我最旧的一个。似乎我遗漏了一些东西,但我找不到它。

再次感谢

mra*_*teb 6

您需要做的就是将 更改getLastOrdersLinesStats()为如下:

public function getLastOrdersLinesStats()
{
    return $this->hasMany(OrdersLinesStats::className(), ['lineID' => 'id'])
        ->orderBy(['id'=>SORT_DESC])
        ->one();
}
Run Code Online (Sandbox Code Playgroud)

这基本上返回每个订单所需的最后一个 OrderLinesStats 行

您可以按如下方式访问它:

例如,如果您有一个名为的对象myOrder,那么您可以访问所需的行myOrder->lastOrderLinesStats