简体   繁体   English

编写ActiveQuery以获得基于ID和父ID的父行和子行?

[英]Write ActiveQuery to get parent and child rows based on id and parent id?

I have a table 'orders' that looks a bit like this: 我有一个表“订单”,看起来有点像这样:

order_id    parent_id    item
14056       14054        Cheese
14055       14054        Butter
14054       NULL         Bread

Now, when I have the order id = 14055 I want to return all rows that are related. 现在,当我的订单ID = 14055时,我想返回所有相关的行。 Same if order_id = 14056 or 14054. 如果order_id = 14056或14054,则相同。

I think this will work: 我认为这会起作用:

Solution 1 解决方案1

Define the relations in your Orders model: 在您的Orders模型中定义关系:

/**
 * @return \yii\db\ActiveQuery
 */
public function getParent()
{
    return $this->hasOne(Orders::className(), ['order_id' => 'parent_id']);
}

/**
 * @return \yii\db\ActiveQuery
 */
public function getOrders()
{
    return $this->hasMany(Orders::className(), ['parent_id' => 'order_id']);
}

And then you can run the following: 然后,您可以运行以下命令:

$data = Orders::find()
        ->from('orders orders')
        ->joinWith('parent parent')
        ->where(['parent.order_id' => 14054])
        ->all();

The SQL which is produced is: 生成的SQL是:

SELECT `orders`.* 
FROM `orders` `orders` 
LEFT JOIN `orders` parent
ON `orders`.`parent_id` = `parent`.`order_id` 
WHERE `parent`.`order_id`= 14054

Solution 2 解决方案2

Without relations you can you something like this: 没有关系,您可以这样:

$sub_query = Orders::find()
        ->select(['order_id'])
        ->where(['order_id' => 14054]);
$query = Orders::find()->where(['in', 'parent_id', $sub_query]);
$data = $query->all();

Solution 3 解决方案3

Using nested query: 使用嵌套查询:

$sub_query = Orders::find()
        ->select(['order_id'])
        ->where(['order_id' => 14054]);
$query = Orders::find()
        ->from('orders orders');
$query->innerJoin(['parent' => $sub_query], 'orders.parent_id = parent.order_id');
$data = $query->all();

The produced SQL is the following: 产生的SQL如下:

SELECT `orders1`.* 
FROM `orders` `orders1` 
INNER JOIN (
    SELECT `order_id` FROM `orders` WHERE `order_id` = 14054
) `parent` 
ON orders.parent_id = parent.order_id

Solution 4 解决方案4

I think that also the following will work too: 我认为以下内容也将起作用:

Define the new inverted relation in Orders model: Orders模型中定义新的inverted关系:

public function getOrders1()
    {
        return $this->hasMany(Orders::className(), ['parent_id' => 'order_id'])->inverseOf('orders');
    }

Now run the query: 现在运行查询:

$data = Orders::find()
        ->with(['orders1'])
        ->all();

More about the inverted relations here . 更多关于这里的倒置关系。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM