gpt4 book ai didi

php - 编写ActiveQuery根据id和父id获取父行和子行?

转载 作者:行者123 更新时间:2023-11-29 07:12:52 25 4
gpt4 key购买 nike

我有一个表“订单”,看起来有点像这样:

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

现在,当我的订单 id = 14055 时,我想返回所有相关的行。如果 order_id = 14056 或 14054,则相同。

最佳答案

我认为这会起作用:

解决方案1

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

然后您可以运行以下命令:

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

生成的 SQL 是:

SELECT `orders`.* 
FROM `orders` `orders`
LEFT JOIN `orders` parent
ON `orders`.`parent_id` = `parent`.`order_id`
WHERE `parent`.`order_id`= 14054
<小时/>

解决方案2

没有关系,你可以做这样的事情:

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

解决方案3

使用嵌套查询:

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

生成的 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
<小时/>

解决方案4

我认为以下内容也将起作用:

Orders模型中定义新的inverted关系:

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

现在运行查询:

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

有关倒排关系的更多信息 here .

关于php - 编写ActiveQuery根据id和父id获取父行和子行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39005197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com