【问题标题】:Yii2 ActiveQuery join keep returns unique record valuesYii2 ActiveQuery join keep 返回唯一的记录值
【发布时间】:2021-05-18 13:52:50
【问题描述】:

主表

CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nama` varchar(255) NOT NULL,
  `lat` float(10,6) DEFAULT NULL,
  `lng` float(10,6) DEFAULT NULL,
  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 活动记录的用户时,它只给了我唯一的行。

请帮忙

感谢和问候, 巴尔吉特

【问题讨论】:

  • 右连接也会添加没有顺序的order_seller_detail,但这应该是不可能的,所以使用连接并跳过右
  • 感谢您的快速回复,我使用了 ->join('RIGHT JOIN','order_seller_detail', 'order_seller_detail.order_id = orders.id') 但同样的问题返回不同的订单
  • 问题不是join,你试过直接在数据库中select吗?
  • @nbk 是的,我们尝试在数据库中手动运行查询,结果是 fin 并显示了多个主表记录 SELECT orders.* FROM orders RIGHT JOIN order_seller_detail ON rder_seller_detail.order_id =订单.id。但是当我使用 yii2 activequery 时它给出的结果不一样

标签: mysql yii2 unique right-join


【解决方案1】:

您只选择订单,因此您只能从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,1),(3,2),(4,2)
SELECT 
    `orders`.*
    ,`order_seller_detail`.*
FROM
    `orders`
        JOIN
    `order_seller_detail` ON order_seller_detail.order_id = orders.id
编号 |编号 | order_id -: | -: | --------: 1 | 1 | 1 1 | 2 | 1 2 | 3 | 2 2 | 4 | 2

db小提琴here

【讨论】:

  • 谢谢,我很努力,但没有工作,同样的结果。它们是订单表中的一条记录和 order_seller_detail 中的两条记录,其中 order_id 与 order.id 关联。现在我们希望那里应该显示两行,但我得到一排订单。
  • 这很奇怪,看我的例子,查询应该运行得很好。看看你能不能重现你的结果
  • jsonblob.com/64ec4613-6fbd-11eb-8f1d-55a0eff15692 "order": [ { "id": "210", "order_seller_detail_id": "308", "order_id": "210" }, { "id": "211" , "order_seller_detail_id": "309", "order_id": "211" } ] 但它在 yii2 activeRecord 中给出了上述结果,订单 id 211 在 order_seller_detail 中有两条记录。但它只告诉我一个。他们应该是两个。虽然当手动运行查询时它在数据库上很好
【解决方案2】:

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

$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,
]);

【讨论】:

    猜你喜欢
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多