Mysql Yii2查询返回2行,仅一个模型

Mysql Yii2查询返回2行,仅一个模型,mysql,activerecord,yii2,Mysql,Activerecord,Yii2,在Yii2中,我在控制器中使用以下代码: $licenses = License::find() ->select('`license`.*, `customer`.*') ->orderBy('added_on') ->innerJoin('customer', '`customer`.`id` = `license`.`customer_id`') ->where([ 'activ

在Yii2中,我在控制器中使用以下代码:

$licenses = License::find()
        ->select('`license`.*, `customer`.*')
        ->orderBy('added_on')
        ->innerJoin('customer', '`customer`.`id` = `license`.`customer_id`')
        ->where([
            'active' => '1'
        ])
        ->andWhere(['not', ['customer_id' => null]])
        ->andWhere("last_changed > last_confirmed")
        ->all();

    return $this->render('not-handled', [
        'licenses' => $licenses
    ]);
输出以下查询(从Yii2调试工具栏):

在数据库上运行此查询将返回2行,这是正确的。但是,当从$licenses转储数据时,它只返回一行。但是,当我在licenses表中更改customer_id时,它会同时返回两行。因此,即使查询返回正确的值,Yii2也会在某个地方删除一行

我找了很多,但是我找不到解决这个问题的办法。提前谢谢你

编辑1

在我的许可证模型中,我有以下功能。删除此函数仍然会导致相同的问题,但是它会得到另一行(相反)。还是一排

public function getCustomer()
{
    return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
}
编辑2

这是废弃的桌子。当我将id为3和4的行上的customer_id更改为其他值时(在转储中,它们都是2,一旦我将其中一个值更改为另一个值),它将返回这两行

DROP TABLE IF EXISTS `customer`;
CREATE TABLE `customer` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(70) NOT NULL,
  `streetname` varchar(100) NOT NULL,
  `house_number` int(20) NOT NULL,
  `city` varchar(100) NOT NULL,
  `postal_code` varchar(7) NOT NULL,
  `email` varchar(100) NOT NULL,
  `username` varchar(45) NOT NULL,
  `password` varchar(45) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

INSERT INTO `customer` VALUES (1,'Dummyuser1','Dummystreet1',1,'Dummtcity1','1111 DE','dummy1@hotmail.com','dummy1','dummy1'),(2,'Dummyuser2','Dummestreet2',2,'Dummycity2','2222 RR','dummy2@hotmail.com','dummy2','dummy2');

DROP TABLE IF EXISTS `license`;
CREATE TABLE `license` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `license` varchar(29) NOT NULL,
  `added_on` datetime NOT NULL,
  `license_activated_on` datetime NOT NULL,
  `last_changed` datetime NOT NULL,
  `last_confirmed` datetime NOT NULL,
  `requested_by` varchar(70) NOT NULL,
  `changed_by` varchar(70) NOT NULL,
  `active` enum('0','1') NOT NULL DEFAULT '0',
  `customer_id` int(10) NOT NULL,
  `costs` int(10) NOT NULL,
  `article_type` enum('1','3') NOT NULL DEFAULT '1',
  `invoice_number` int(10) NOT NULL,
  `invoice_date` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `license_UNIQUE` (`license`),
  UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;


INSERT INTO `license` VALUES (1,'DFDFD-DFDFD-DFDFD-QASDF','2016-04-22 17:06:57','0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','Wessel','','1',0,30,'1',0,'0000-00-00 00:00:00'),(2,'ABCDE-FGHIJ-KLMNO-PQRST','2016-04-22 17:36:25','0000-00-00 00:00:00','2016-04-22 17:36:25','2016-04-22 18:00:00','Wesel','Wessel2','1',1,400,'3',34342,'2016-04-22 17:36:25'),(3,'QWERT-YUIOP-ASDFG-HJKLZ','2016-04-23 10:51:19','2016-04-23 10:51:19','2016-04-23 10:51:19','0000-00-00 00:00:00','Wessel Dummy','','1',2,40,'1',0,'0000-00-00 00:00:00'),(4,'QWERT-YUIOP-ASDFG-AAAAA','2016-04-23 10:51:19','2016-04-23 10:51:19','2016-04-23 10:51:19','0000-00-00 00:00:00','Wessel Dummy1','d','1',2,40,'1',0,'0000-00-00 00:00:00'),(5,'ABCDE-FGHIJ-DD4NO-PQRST','2016-04-22 17:36:25','0000-00-00 00:00:00','2016-04-22 17:36:25','2016-04-22 18:00:00','Wesel','Wessel2','1',2,400,'3',34342,'2016-04-22 17:36:25'),(7,'DFDFD-DFDFD-DFDFD-QQQQQ','2016-04-22 17:06:57','0000-00-00 00:00:00','0000-00-00 00:00:00','0000-00-00 00:00:00','Wessel','','1',0,30,'1',0,'0000-00-00 00:00:00');

这不是答案,而是检查问题来源的建议

可能是activeQuery在数据库控制台中生成的查询与您在db控制台中使用的查询不同

尝试获取yii2使用的命令,并检查是否与预期的相同

$dbcommand = License::find()
    ->select('`license`.*, `customer`.*')
    ->orderBy('added_on')
    ->innerJoin('customer', '`customer`.`id` = `license`.`customer_id`')
    ->where([
        'active' => '1'
    ])
    ->andWhere(['not', ['customer_id' => null]])
    ->andWhere("last_changed > last_confirmed")->createCommand();
试一试

试一试

你得到了多少结果?如果您只选择一行,这与您正在使用的License::find()有关,并且查询的License部分只返回一个模型,因为这两个记录的License部分是相同的

然后尝试使用命令

use Yii;

$query= \Yii::$app->db->createCommand(
  "SELECT `license`.*, `customer`.* 
   FROM `license` 
   INNER JOIN `customer` ON `customer`.`id` = `license`.`customer_id` 
   WHERE ((`active`='1') 
   AND (NOT (`customer_id` IS NULL))) 
   AND (last_changed > last_confirmed) 
   ORDER BY `added_on`;");

$licenses = $query->queryAll();

对于调试ActiveQuery,我建议如下:

$licenses = License::find()
        ->select('`license`.*, `customer`.*')
        ->orderBy('added_on')
        ->innerJoin('customer', '`customer`.`id` = `license`.`customer_id`')
        ->where([
            'active' => '1'
        ])
        ->andWhere(['not', ['customer_id' => null]])
        ->andWhere("last_changed > last_confirmed")
//        ->all()
;

var_dump($licenses->prepare( Yii::$app->db->queryBuilder )->createCommand()->rawSql);

顺便说一句,我猜您已经为两个客户分配了一个许可证,因此您得到了一个许可证模型和两个客户分配给同一个许可证。

您确定所有结果表单转储都可见吗?如果转储很大,浏览器不会显示所有结果。.许可证表中只有6行,客户表中只有2行。该查询仅返回2行。所以这应该不是问题。我有一个建议。。让我知道你能在你的许可证模型中显示客户关系吗?@topher我已将其添加到主帖子中。请参见编辑1。这可能是一个愚蠢的问题(我对Yii2还是很陌生),但如何获取该命令?当我var_转储$dbcommand变量时,它不会显示任何查询。数组中填充了基本信息(例如连接数据)。此回显如下:
SELECT
license
*,
customer
customer
上的
许可证内部加入
customer
=
license
customer\u id
其中(
active
=:qp0)和(非(
customer\u id
为空))和(上次更改>上次确认)订单,由`added\u ON``在数据库控制台中执行此查询(将正确的值添加到参数中)您的结果与您选择的结果相同?。两个查询是否不同?实际上没有变化。查询完全相同,并给出相同的结果。对于调试部分,他们已经在上面进行了解释。不,相反,两个许可证分配了一个客户。
foreach($licenses as $key=> $value) {
  var_dump($value->license );
}
use Yii;

$query= \Yii::$app->db->createCommand(
  "SELECT `license`.*, `customer`.* 
   FROM `license` 
   INNER JOIN `customer` ON `customer`.`id` = `license`.`customer_id` 
   WHERE ((`active`='1') 
   AND (NOT (`customer_id` IS NULL))) 
   AND (last_changed > last_confirmed) 
   ORDER BY `added_on`;");

$licenses = $query->queryAll();
$licenses = License::find()
        ->select('`license`.*, `customer`.*')
        ->orderBy('added_on')
        ->innerJoin('customer', '`customer`.`id` = `license`.`customer_id`')
        ->where([
            'active' => '1'
        ])
        ->andWhere(['not', ['customer_id' => null]])
        ->andWhere("last_changed > last_confirmed")
//        ->all()
;

var_dump($licenses->prepare( Yii::$app->db->queryBuilder )->createCommand()->rawSql);