1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<?php
namespace yiiunit\extensions\mongodb;
use yiiunit\data\ar\mongodb\ActiveRecord;
use yiiunit\data\ar\mongodb\Customer;
use yiiunit\data\ar\mongodb\CustomerOrder;
/**
* @group mongodb
*/
class ActiveRelationTest extends MongoDbTestCase
{
protected function setUp()
{
parent::setUp();
ActiveRecord::$db = $this->getConnection();
$this->setUpTestRows();
}
protected function tearDown()
{
$this->dropCollection(Customer::collectionName());
$this->dropCollection(CustomerOrder::collectionName());
parent::tearDown();
}
/**
* Sets up test rows.
*/
protected function setUpTestRows()
{
$customers = [];
for ($i = 1; $i <= 5; $i++) {
$customers[] = [
'name' => 'name' . $i,
'email' => 'email' . $i,
'address' => 'address' . $i,
'status' => $i,
];
}
$customerCollection = $this->getConnection()->getCollection('customer');
$customers = $customerCollection->batchInsert($customers);
$items = [];
for ($i = 1; $i <= 10; $i++) {
$items[] = [
'name' => 'name' . $i,
'price' => $i,
];
}
$itemCollection = $this->getConnection()->getCollection('item');
$items = $itemCollection->batchInsert($items);
$customerOrders = [];
foreach ($customers as $i => $customer) {
$customerOrders[] = [
'customer_id' => $customer['_id'],
'number' => $customer['status'],
'item_ids' => [
$items[$i]['_id'],
$items[$i+5]['_id'],
],
];
$customerOrders[] = [
'customer_id' => $customer['_id'],
'number' => $customer['status'] + 100,
'item_ids' => [
$items[$i]['_id'],
$items[$i+5]['_id'],
],
];
}
$customerOrderCollection = $this->getConnection()->getCollection('customer_order');
$customerOrderCollection->batchInsert($customerOrders);
}
// Tests :
public function testFindLazy()
{
/* @var $order CustomerOrder */
$order = CustomerOrder::findOne(['number' => 2]);
$this->assertFalse($order->isRelationPopulated('customer'));
$customer = $order->customer;
$this->assertTrue($order->isRelationPopulated('customer'));
$this->assertTrue($customer instanceof Customer);
$this->assertEquals((string) $customer->_id, (string) $order->customer_id);
$this->assertEquals(1, count($order->relatedRecords));
}
public function testFindEager()
{
$orders = CustomerOrder::find()->with('customer')->all();
$this->assertEquals(10, count($orders));
$this->assertTrue($orders[0]->isRelationPopulated('customer'));
$this->assertTrue($orders[1]->isRelationPopulated('customer'));
$this->assertTrue($orders[0]->customer instanceof Customer);
$this->assertEquals((string) $orders[0]->customer->_id, (string) $orders[0]->customer_id);
$this->assertTrue($orders[1]->customer instanceof Customer);
$this->assertEquals((string) $orders[1]->customer->_id, (string) $orders[1]->customer_id);
}
/**
* @see https://github.com/yiisoft/yii2/issues/5411
*
* @depends testFindEager
*/
public function testFindEagerHasManyByArrayKey()
{
$order = CustomerOrder::find()->where(['number' => 1])->with('items')->one();
$this->assertNotEmpty($order->items);
}
}