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

标签 php mysql activerecord yii2

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

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/

相关文章:

ruby-on-rails - 如何建立HABTM关系

php 正在锁定已删除的 session 文件

php - Symfony2 用户切换后缺少 ROLE_PREVIOUS_ADMIN

mysql - 带有子查询的选择中的上层表可见性

php - 显示多个sql查询并按时间戳排序

ruby-on-rails - 将 Rails 模型配置为仅返回特定年份的对象

php - 线程PHP中的全局增量

php - 我可以使用 PDO 准备语句来绑定(bind)标识符(表或字段名称)或语法关键字吗?

MySQL Join 与 Insert 相结合?

ruby-on-rails - Rails 3 事件记录计算 : Sum and Average at the same time