0
我有一個表「訂單」,看起來有點像這樣:編寫ActiveQuery獲取基於id和父id的父行和子行?
order_id parent_id item
14056 14054 Cheese
14055 14054 Butter
14054 NULL Bread
現在,當我有訂單id = 14055我想返回相關的所有行。相同的,如果ORDER_ID = 14056或14054.
我有一個表「訂單」,看起來有點像這樣:編寫ActiveQuery獲取基於id和父id的父行和子行?
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
我認爲這也是下面的工作太:
定義新inverted
關係在Orders
模型:
public function getOrders1()
{
return $this->hasMany(Orders::className(), ['parent_id' => 'order_id'])->inverseOf('orders');
}
現在運行查詢:
$data = Orders::find()
->with(['orders1'])
->all();
更多關於倒置關係here。