NamedParametersTest.php 6.71 KB
Newer Older
1 2 3 4 5
<?php

namespace Doctrine\Tests\DBAL\Functional\Ticket;

use Doctrine\DBAL\Connection;
6 7
use Doctrine\DBAL\FetchMode;
use Doctrine\DBAL\ParameterType;
8
use Doctrine\DBAL\Schema\Table;
9 10
use const CASE_LOWER;
use function array_change_key_case;
11 12 13 14 15 16 17 18

/**
 * @group DDC-1372
 */
class NamedParametersTest extends \Doctrine\Tests\DbalFunctionalTestCase
{
    public function ticketProvider()
    {
19 20
        return [
            [
21
                'SELECT * FROM ddc1372_foobar f WHERE f.foo = :foo AND f.bar IN (:bar)',
22 23 24 25 26
                [
                    'foo' => 1,
                    'bar' => [1, 2, 3],
                ],
                [
27 28
                    'foo' => ParameterType::INTEGER,
                    'bar' => Connection::PARAM_INT_ARRAY,
29 30 31 32 33 34 35 36 37
                ],
                [
                    ['id' => 1, 'foo' => 1, 'bar' => 1],
                    ['id' => 2, 'foo' => 1, 'bar' => 2],
                    ['id' => 3, 'foo' => 1, 'bar' => 3],
                ],
            ],

            [
38
                'SELECT * FROM ddc1372_foobar f WHERE f.foo = :foo AND f.bar IN (:bar)',
39 40 41 42 43
                [
                    'foo' => 1,
                    'bar' => [1, 2, 3],
                ],
                [
44 45
                    'bar' => Connection::PARAM_INT_ARRAY,
                    'foo' => ParameterType::INTEGER,
46 47 48 49 50 51 52 53 54
                ],
                [
                    ['id' => 1, 'foo' => 1, 'bar' => 1],
                    ['id' => 2, 'foo' => 1, 'bar' => 2],
                    ['id' => 3, 'foo' => 1, 'bar' => 3],
                ],
            ],

            [
55
                'SELECT * FROM ddc1372_foobar f WHERE f.bar IN (:bar) AND f.foo = :foo',
56 57 58 59 60
                [
                    'foo' => 1,
                    'bar' => [1, 2, 3],
                ],
                [
61 62
                    'bar' => Connection::PARAM_INT_ARRAY,
                    'foo' => ParameterType::INTEGER,
63 64 65 66 67 68 69 70 71
                ],
                [
                    ['id' => 1, 'foo' => 1, 'bar' => 1],
                    ['id' => 2, 'foo' => 1, 'bar' => 2],
                    ['id' => 3, 'foo' => 1, 'bar' => 3],
                ],
            ],

            [
72
                'SELECT * FROM ddc1372_foobar f WHERE f.bar IN (:bar) AND f.foo = :foo',
73 74 75 76 77
                [
                    'foo' => 1,
                    'bar' => ['1', '2', '3'],
                ],
                [
78 79
                    'bar' => Connection::PARAM_STR_ARRAY,
                    'foo' => ParameterType::INTEGER,
80 81 82 83 84 85 86 87 88
                ],
                [
                    ['id' => 1, 'foo' => 1, 'bar' => 1],
                    ['id' => 2, 'foo' => 1, 'bar' => 2],
                    ['id' => 3, 'foo' => 1, 'bar' => 3],
                ],
            ],

            [
89
                'SELECT * FROM ddc1372_foobar f WHERE f.bar IN (:bar) AND f.foo IN (:foo)',
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
                [
                    'foo' => ['1'],
                    'bar' => [1, 2, 3, 4],
                ],
                [
                    'bar' => Connection::PARAM_STR_ARRAY,
                    'foo' => Connection::PARAM_INT_ARRAY,
                ],
                [
                    ['id' => 1, 'foo' => 1, 'bar' => 1],
                    ['id' => 2, 'foo' => 1, 'bar' => 2],
                    ['id' => 3, 'foo' => 1, 'bar' => 3],
                    ['id' => 4, 'foo' => 1, 'bar' => 4],
                ],
            ],

            [
107
                'SELECT * FROM ddc1372_foobar f WHERE f.bar IN (:bar) AND f.foo IN (:foo)',
108 109 110 111 112 113 114 115 116 117 118 119 120 121
                [
                    'foo' => 1,
                    'bar' => 2,
                ],
                [
                    'bar' => ParameterType::INTEGER,
                    'foo' => ParameterType::INTEGER,
                ],
                [
                    ['id' => 2, 'foo' => 1, 'bar' => 2],
                ],
            ],

            [
122
                'SELECT * FROM ddc1372_foobar f WHERE f.bar = :arg AND f.foo <> :arg',
123 124
                ['arg' => '1'],
                [
125
                    'arg' => ParameterType::STRING,
126 127 128 129 130
                ],
                [
                    ['id' => 5, 'foo' => 2, 'bar' => 1],
                ],
            ],
131

132
            [
133
                'SELECT * FROM ddc1372_foobar f WHERE f.bar NOT IN (:arg) AND f.foo IN (:arg)',
134 135 136 137 138 139 140 141 142 143 144 145
                [
                    'arg' => [1, 2],
                ],
                [
                    'arg' => Connection::PARAM_INT_ARRAY,
                ],
                [
                    ['id' => 3, 'foo' => 1, 'bar' => 3],
                    ['id' => 4, 'foo' => 1, 'bar' => 4],
                ],
            ],
        ];
146
    }
147

148
    protected function setUp()
149 150 151
    {
        parent::setUp();

152
        if (! $this->_conn->getSchemaManager()->tablesExist('ddc1372_foobar')) {
153
            try {
154
                $table = new Table('ddc1372_foobar');
155
                $table->addColumn('id', 'integer');
156 157 158
                $table->addColumn('foo', 'string');
                $table->addColumn('bar', 'string');
                $table->setPrimaryKey(['id']);
159 160 161 162

                $sm = $this->_conn->getSchemaManager();
                $sm->createTable($table);

163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
                $this->_conn->insert('ddc1372_foobar', [
                    'id'  => 1,
                    'foo' => 1,
                    'bar' => 1,
                ]);
                $this->_conn->insert('ddc1372_foobar', [
                    'id'  => 2,
                    'foo' => 1,
                    'bar' => 2,
                ]);
                $this->_conn->insert('ddc1372_foobar', [
                    'id'  => 3,
                    'foo' => 1,
                    'bar' => 3,
                ]);
                $this->_conn->insert('ddc1372_foobar', [
                    'id'  => 4,
                    'foo' => 1,
                    'bar' => 4,
                ]);
                $this->_conn->insert('ddc1372_foobar', [
                    'id'  => 5,
                    'foo' => 2,
                    'bar' => 1,
                ]);
                $this->_conn->insert('ddc1372_foobar', [
                    'id'  => 6,
                    'foo' => 2,
                    'bar' => 2,
                ]);
193 194 195 196 197 198 199 200 201
            } catch(\Exception $e) {
                $this->fail($e->getMessage());
            }
        }
    }

    /**
     * @dataProvider ticketProvider
     * @param string $query
202 203 204
     * @param array  $params
     * @param array  $types
     * @param array  $expected
205 206 207 208
     */
    public function testTicket($query,$params,$types,$expected)
    {
        $stmt   = $this->_conn->executeQuery($query, $params, $types);
209
        $result = $stmt->fetchAll(FetchMode::ASSOCIATIVE);
210

211 212 213 214
        foreach ($result as $k => $v) {
            $result[$k] = array_change_key_case($v, CASE_LOWER);
        }

215
        self::assertEquals($result, $expected);
216
    }
217
}