问题描述
主表
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,]);