微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Yii2 ActiveQuery join keep 返回唯一记录值

如何解决Yii2 ActiveQuery join keep 返回唯一记录值

主表

CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,`nama` varchar(255) NOT NULL,`lat` float(10,6) DEFAULT NULL,`lng` float(10,PRIMARY KEY (`id`)
)

第二张桌子

CREATE TABLE `order_seller_detail` (
  `id` int(11) NOT NULL AUTO_INCREMENT,`order_id` int(11) DEFAULT NULL,`sequence` int(2) DEFAULT NULL,PRIMARY KEY (`id`)
  
)

我在尝试使用右连接时遇到问题。它只返回唯一的行。但它们在表 order_seller_detail 中的多个记录与带有 id 的订单表相关联。它应该是多行。 我的代码

 $query = Order::find()
         ->rightJoin('order_seller_detail','order_seller_detail.order_id=orders.id')
        ->all();

我还使用以下命令打印查询

$query = Order::find()
         ->rightJoin('order_seller_detail','order_seller_detail.order_id=orders.id');
$query->createCommand()->getRawsql();
SELECT `orders`.* FROM `orders` RIGHT JOIN `order_seller_detail` ON rder_seller_detail.order_id=orders.id

当我手动运行此查询时,它工作正常并为同一订单提供多行,但是当我使用 yii2 活动记录时,它只给我唯一的行。

请帮忙

谢谢和问候, 巴尔吉特

解决方法

您只是在选择订单,因此您只能从 orders 获取行,但您还需要添加来自 order_seller_detail 的至少一列

 $query = Order::find()
->select([
        'orders.*',// select all ordersfields
        'order_seller_detail.*' // select all order_seller_detail fields   ])
->Join('order_seller_detail','order_seller_detail.order_id=orders.id')
        ->all()

结果查询则是

SELECT 
    `orders`.*,`order_seller_detail`.*
FROM
    `orders`
        JOIN
    `order_seller_detail` ON rder_seller_detail.order_id = orders.id

举个例子

CREATE TABLE orders (id int)
INSERT INTO orders  VALUES  (1),(2);
CREATE TABLE order_seller_detail(id int,order_id int)
INSERT INTO order_seller_detail VALUES (1,1),(2,(3,2),(4,2)
SELECT 
    `orders`.*,`order_seller_detail`.*
FROM
    `orders`
        JOIN
    `order_seller_detail` ON order_seller_detail.order_id = orders.id
id | id | order_id
-: | -: | -------:
 1 |  1 |        1
 1 |  2 |        1
 2 |  3 |        2
 2 |  4 |        2

dbfiddle here

,

为什么不使用模型关系?例如

$orders = Order::find()
->joinWith('orderSellerDetails')
->all();

然后:

foreach($orders as $order){
    $sellerDetails = $order->orderSellerDetails; // your multirows from table 'order_seller_details' to current order
}

你的模型关系必须是这样的:

public function getOrderSellerDetails()
    {
        return $this->hasMany(OderSellerDetail::className(),['order_id' => 'id']);
    }

或者,如果您使用 gridview,只需先从 order_seller_detail 中选择数据,因为 gridview 将您的行分组

喜欢:

$query = OrderSellerDetail::find()
->joinWith('order');

$dataProvider = new ActiveDataProvider([
    'query' => $query,]);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?