Completed
Pull Request — master (#1402)
by
unknown
07:21
created

Table::getColumn()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 10
rs 9.9332
c 0
b 0
f 0
ccs 0
cts 3
cp 0
cc 1
nc 1
nop 1
crap 2
1
<?php
2
/**
3
 * Phinx
4
 *
5
 * (The MIT license)
6
 * Copyright (c) 2015 Rob Morgan
7
 *
8
 * Permission is hereby granted, free of charge, to any person obtaining a copy
9
 * of this software and associated * documentation files (the "Software"), to
10
 * deal in the Software without restriction, including without limitation the
11
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
12
 * sell copies of the Software, and to permit persons to whom the Software is
13
 * furnished to do so, subject to the following conditions:
14
 *
15
 * The above copyright notice and this permission notice shall be included in
16
 * all copies or substantial portions of the Software.
17
 *
18
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
24
 * IN THE SOFTWARE.
25
 *
26
 * @package    Phinx
27
 * @subpackage Phinx\Db
28
 */
29
namespace Phinx\Db;
30
31
use Phinx\Db\Action\AddColumn;
32
use Phinx\Db\Action\AddForeignKey;
33
use Phinx\Db\Action\AddIndex;
34
use Phinx\Db\Action\ChangeColumn;
35
use Phinx\Db\Action\CreateTable;
36
use Phinx\Db\Action\DropColumn;
37
use Phinx\Db\Action\DropForeignKey;
38
use Phinx\Db\Action\DropIndex;
39
use Phinx\Db\Action\DropTable;
40
use Phinx\Db\Action\RemoveColumn;
41
use Phinx\Db\Action\RenameColumn;
42
use Phinx\Db\Action\RenameTable;
43
use Phinx\Db\Adapter\AdapterInterface;
44
use Phinx\Db\Plan\Intent;
45
use Phinx\Db\Plan\Plan;
46
use Phinx\Db\Table\Column;
47
use Phinx\Db\Table\Table as TableValue;
48
49
/**
50
 *
51
 * This object is based loosely on: http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Table.html.
52
 */
53
class Table
54
{
55
    /**
56
     * @var \Phinx\Db\Table\Table
57
     */
58
    protected $table;
59
60
    /**
61
     * @var \Phinx\Db\Adapter\AdapterInterface
62
     */
63
    protected $adapter;
64
65
    /**
66
     * @var \Phinx\Db\Plan\Intent
67
     */
68
    protected $actions;
69
70
    /**
71
     * @var array
72
     */
73
    protected $data = [];
74
75
    /**
76
     * Class Constuctor.
77
     *
78
     * @param string $name Table Name
79
     * @param array $options Options
80
     * @param \Phinx\Db\Adapter\AdapterInterface $adapter Database Adapter
81
     */
82
    public function __construct($name, $options = [], AdapterInterface $adapter = null)
83
    {
84 239
        $this->table = new TableValue($name, $options);
85
        $this->actions = new Intent();
86 239
87 239
        if ($adapter !== null) {
88
            $this->setAdapter($adapter);
89 239
        }
90 231
    }
91 231
92 239
    /**
93
     * Gets the table name.
94
     *
95
     * @return string|null
96
     */
97
    public function getName()
98
    {
99
        return $this->table->getName();
100 239
    }
101
102 239
    /**
103 239
     * Gets the table options.
104
     *
105
     * @return array
106
     */
107
    public function getOptions()
108
    {
109
        return $this->table->getOptions();
110
    }
111 215
112
    /**
113 215
     * Gets the table name and options as an object
114
     *
115
     * @return \Phinx\Db\Table\Table
116
     */
117
    public function getTable()
118
    {
119
        return $this->table;
120
    }
121
122 239
    /**
123
     * Sets the database adapter.
124 239
     *
125 239
     * @param \Phinx\Db\Adapter\AdapterInterface $adapter Database Adapter
126
     * @return \Phinx\Db\Table
127
     */
128
    public function setAdapter(AdapterInterface $adapter)
129
    {
130
        $this->adapter = $adapter;
131
132
        return $this;
133 189
    }
134
135 189
    /**
136
     * Gets the database adapter.
137
     *
138
     * @return \Phinx\Db\Adapter\AdapterInterface|null
139
     */
140
    public function getAdapter()
141
    {
142
        if (!$this->adapter) {
143
            throw new \RuntimeException('There is no database adapter set yet, cannot proceed');
144 231
        }
145
146 231
        return $this->adapter;
147 231
    }
148
149
    /**
150
     * Does the table exist?
151
     *
152
     * @return bool
153
     */
154
    public function exists()
155 225
    {
156
        return $this->getAdapter()->hasTable($this->getName());
157 225
    }
158
159
    /**
160
     * Drops the database table.
161
     *
162
     * @return \Phinx\Db\Table
163
     */
164
    public function drop()
165 195
    {
166
        $this->actions->addAction(new DropTable($this->table));
167 195
168
        return $this;
169
    }
170
171
    /**
172
     * Renames the database table.
173
     *
174
     * @param string $newTableName New Table Name
175 1
     * @return \Phinx\Db\Table
176
     */
177 1
    public function rename($newTableName)
178 1
    {
179
        $this->actions->addAction(new RenameTable($this->table, $newTableName));
180
181
        return $this;
182
    }
183
184
    /**
185
     * Gets an array of the table columns.
186 3
     *
187
     * @return \Phinx\Db\Table\Column[]
188 3
     */
189 3
    public function getColumns()
190 3
    {
191
        return $this->getAdapter()->getColumns($this->getName());
192
    }
193
194
    /**
195
     * Gets a table column if it exists.
196
     *
197
     * @param string $name
198
     * @return \Phinx\Db\Table\Column|null
199
     */
200
    public function getColumn($name) {
201
        $columns = array_filter(
202
            $this->getColumns(),
203
            function($column) use ($name) {
204
                return $column->getName() === $name;
205
            }
206
        );
207
208
        return array_pop($columns);
209
    }
210
211 10
    /**
212
     * Sets an array of data to be inserted.
213 10
     *
214
     * @param array $data Data
215
     * @return \Phinx\Db\Table
216
     */
217
    public function setData($data)
218
    {
219
        $this->data = $data;
220
221
        return $this;
222 196
    }
223
224 196
    /**
225 196
     * Gets the data waiting to be inserted.
226
     *
227
     * @return array
228
     */
229
    public function getData()
230
    {
231
        return $this->data;
232
    }
233 204
234
    /**
235 204
     * Resets all of the pending data to be inserted
236
     *
237
     * @return void
238
     */
239
    public function resetData()
240
    {
241
        $this->setData([]);
242
    }
243
244 196
    /**
245
     * Resets all of the pending table changes.
246 196
     *
247 196
     * @return void
248
     */
249
    public function reset()
250
    {
251
        $this->actions = new Intent();
252
        $this->resetData();
253
    }
254
255 191
    /**
256
     * Add a table column.
257 191
     *
258
     * Type can be: string, text, integer, float, decimal, datetime, timestamp,
259
     * time, date, binary, boolean.
260
     *
261
     * Valid options can be: limit, default, null, precision or scale.
262
     *
263
     * @param string|\Phinx\Db\Table\Column $columnName Column Name
264
     * @param string|\Phinx\Util\Literal $type Column Type
265
     * @param array $options Column Options
266 196
     * @throws \RuntimeException
267
     * @throws \InvalidArgumentException
268 196
     * @return \Phinx\Db\Table
269 196
     */
270
    public function addColumn($columnName, $type = null, $options = [])
271
    {
272 View Code Duplication
        if ($columnName instanceof Column) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
273
            $action = new AddColumn($this->table, $columnName);
274
        } else {
275
            $action = AddColumn::build($this->table, $columnName, $type, $options);
276
        }
277 192
278
        // Delegate to Adapters to check column type
279 192
        if (!$this->getAdapter()->isValidColumnType($action->getColumn())) {
280
            throw new \InvalidArgumentException(sprintf(
281
                'An invalid column type "%s" was specified for column "%s".',
282
                $type,
283
                $action->getColumn()->getName()
284
            ));
285
        }
286
287
        $this->actions->addAction($action);
288 196
289
        return $this;
290 196
    }
291 196
292
    /**
293
     * Remove a table column.
294
     *
295
     * @param string $columnName Column Name
296
     * @return \Phinx\Db\Table
297
     */
298
    public function removeColumn($columnName)
299 197
    {
300
        $action = RemoveColumn::build($this->table, $columnName);
301 197
        $this->actions->addAction($action);
302
303
        return $this;
304
    }
305
306
    /**
307
     * Rename a table column.
308
     *
309 196
     * @param string $oldName Old Column Name
310
     * @param string $newName New Column Name
311 196
     * @return \Phinx\Db\Table
312 196
     */
313 196
    public function renameColumn($oldName, $newName)
314 196
    {
315 196
        $action = RenameColumn::build($this->table, $oldName, $newName);
316
        $this->actions->addAction($action);
317
318
        return $this;
319
    }
320
321
    /**
322
     * Change a table column type.
323
     *
324
     * @param string        $columnName    Column Name
325
     * @param string|\Phinx\Db\Table\Column|\Phinx\Util\Literal $newColumnType New Column Type
326
     * @param array         $options       Options
327
     * @return \Phinx\Db\Table
328
     */
329
    public function changeColumn($columnName, $newColumnType, array $options = [])
330
    {
331 View Code Duplication
        if ($newColumnType instanceof Column) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
332 210
            $action = new ChangeColumn($this->table, $columnName, $newColumnType);
333
        } else {
334
            $action = ChangeColumn::build($this->table, $columnName, $newColumnType, $options);
335 210
        }
336 1
        $this->actions->addAction($action);
337
338
        return $this;
339
    }
340 209
341 207
    /**
342 207
     * Checks to see if a column exists.
343 207
     *
344 207
     * @param string $columnName Column Name
345 207
     * @return bool
346 2
     */
347
    public function hasColumn($columnName)
348
    {
349
        return $this->getAdapter()->hasColumn($this->getName(), $columnName);
350 209
    }
351 1
352 1
    /**
353 1
     * Add an index to a database table.
354 1
     *
355 1
     * In $options you can specific unique = true/false or name (index name).
356
     *
357
     * @param string|array|\Phinx\Db\Table\Index $columns Table Column(s)
358 208
     * @param array $options Index Options
359 208
     * @return \Phinx\Db\Table
360
     */
361
    public function addIndex($columns, array $options = [])
362
    {
363
        $action = AddIndex::build($this->table, $columns, $options);
364
        $this->actions->addAction($action);
365
366
        return $this;
367
    }
368 1
369
    /**
370 1
     * Removes the given index from a table.
371 1
     *
372
     * @param array $columns Columns
373
     * @return \Phinx\Db\Table
374
     */
375
    public function removeIndex(array $columns)
376
    {
377
        $action = DropIndex::build($this->table, $columns);
378
        $this->actions->addAction($action);
379
380
        return $this;
381 4
    }
382
383 4
    /**
384 4
     * Removes the given index identified by its name from a table.
385
     *
386
     * @param string $name Index name
387
     * @return \Phinx\Db\Table
388
     */
389
    public function removeIndexByName($name)
390
    {
391
        $action = DropIndex::buildFromName($this->table, $name);
392
        $this->actions->addAction($action);
393
394
        return $this;
395 17
    }
396
397
    /**
398 17
     * Checks to see if an index exists.
399 4
     *
400 4
     * @param string|array $columns Columns
401 4
     * @return bool
402 4
     */
403 13
    public function hasIndex($columns)
404
    {
405
        return $this->getAdapter()->hasIndex($this->getName(), $columns);
406
    }
407 17
408 15
    /**
409 15
     * Checks to see if an index specified by name exists.
410
     *
411 17
     * @param string $indexName
412 17
     * @return bool
413
     */
414
    public function hasIndexByName($indexName)
415
    {
416
        return $this->getAdapter()->hasIndexByName($this->getName(), $indexName);
417
    }
418
419
    /**
420
     * Add a foreign key to a database table.
421 89
     *
422
     * In $options you can specify on_delete|on_delete = cascade|no_action ..,
423 89
     * on_update, constraint = constraint name.
424
     *
425
     * @param string|array $columns Columns
426
     * @param string|\Phinx\Db\Table $referencedTable   Referenced Table
427
     * @param string|array $referencedColumns Referenced Columns
428
     * @param array $options Options
429
     * @return \Phinx\Db\Table
430
     */
431 View Code Duplication
    public function addForeignKey($columns, $referencedTable, $referencedColumns = ['id'], $options = [])
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
432
    {
433
        $action = AddForeignKey::build($this->table, $columns, $referencedTable, $referencedColumns, $options);
0 ignored issues
show
Bug introduced by
It seems like $columns defined by parameter $columns on line 431 can also be of type array; however, Phinx\Db\Action\AddForeignKey::build() does only seem to accept string|array<integer,string>, maybe add an additional type check?

This check looks at variables that have been passed in as parameters and are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
Bug introduced by
It seems like $referencedTable defined by parameter $referencedTable on line 431 can also be of type object<Phinx\Db\Table>; however, Phinx\Db\Action\AddForeignKey::build() does only seem to accept object<Phinx\Db\Table\Table>|string, maybe add an additional type check?

This check looks at variables that have been passed in as parameters and are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
434
        $this->actions->addAction($action);
435 29
436
        return $this;
437
    }
438 29
439 28
    /**
440 28
     * Add a foreign key to a database table with a given name.
441 22
     *
442 22
     * In $options you can specify on_delete|on_delete = cascade|no_action ..,
443 28
     * on_update, constraint = constraint name.
444 28
     *
445 28
     * @param string $name The constaint name
446 1
     * @param string|array $columns Columns
447
     * @param string|\Phinx\Db\Table $referencedTable   Referenced Table
448
     * @param string|array $referencedColumns Referenced Columns
449 29
     * @param array $options Options
450 29
     * @return \Phinx\Db\Table
451
     */
452 View Code Duplication
    public function addForeignKeyWithName($name, $columns, $referencedTable, $referencedColumns = ['id'], $options = [])
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
453
    {
454
        $action = AddForeignKey::build(
455
            $this->table,
456
            $columns,
0 ignored issues
show
Bug introduced by
It seems like $columns defined by parameter $columns on line 452 can also be of type array; however, Phinx\Db\Action\AddForeignKey::build() does only seem to accept string|array<integer,string>, maybe add an additional type check?

This check looks at variables that have been passed in as parameters and are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
457
            $referencedTable,
0 ignored issues
show
Bug introduced by
It seems like $referencedTable defined by parameter $referencedTable on line 452 can also be of type object<Phinx\Db\Table>; however, Phinx\Db\Action\AddForeignKey::build() does only seem to accept object<Phinx\Db\Table\Table>|string, maybe add an additional type check?

This check looks at variables that have been passed in as parameters and are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
458
            $referencedColumns,
459 1
            $options,
460
            $name
461 1
        );
462 1
        $this->actions->addAction($action);
463
464
        return $this;
465
    }
466
467
    /**
468
     * Removes the given foreign key from the table.
469
     *
470
     * @param string|array $columns    Column(s)
471 1
     * @param null|string  $constraint Constraint names
472
     * @return \Phinx\Db\Table
473 1
     */
474 1
    public function dropForeignKey($columns, $constraint = null)
475
    {
476
        $action = DropForeignKey::build($this->table, $columns, $constraint);
0 ignored issues
show
Bug introduced by
It seems like $columns defined by parameter $columns on line 474 can also be of type array; however, Phinx\Db\Action\DropForeignKey::build() does only seem to accept string|array<integer,string>, maybe add an additional type check?

This check looks at variables that have been passed in as parameters and are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
477
        $this->actions->addAction($action);
478
479
        return $this;
480
    }
481
482
    /**
483
     * Checks to see if a foreign key exists.
484 12
     *
485
     * @param  string|array $columns    Column(s)
486 12
     * @param  null|string  $constraint Constraint names
487
     * @return bool
488
     */
489
    public function hasForeignKey($columns, $constraint = null)
490
    {
491
        return $this->getAdapter()->hasForeignKey($this->getName(), $columns, $constraint);
0 ignored issues
show
Documentation introduced by
$columns is of type string|array, but the function expects a array<integer,string>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
492
    }
493
494
    /**
495
     * Add timestamp columns created_at and updated_at to the table.
496
     *
497
     * @param string|null $createdAt    Alternate name for the created_at column
498
     * @param string|null $updatedAt    Alternate name for the updated_at column
499
     * @param bool        $withTimezone Whether to set the timezone option on the added columns
500
     *
501 8
     * @return \Phinx\Db\Table
502
     */
503 8
    public function addTimestamps($createdAt = 'created_at', $updatedAt = 'updated_at', $withTimezone = false)
504 4
    {
505 4
        $createdAt = is_null($createdAt) ? 'created_at' : $createdAt;
506 8
        $updatedAt = is_null($updatedAt) ? 'updated_at' : $updatedAt;
507 8
508
        $this->addColumn($createdAt, 'timestamp', [
509
                   'default' => 'CURRENT_TIMESTAMP',
510 8
                   'update' => '',
511
                   'timezone' => $withTimezone,
512 8
             ])
513 8
             ->addColumn($updatedAt, 'timestamp', [
514 8
                 'null' => true,
515 8
                 'default' => null,
516
                 'timezone' => $withTimezone,
517 8
             ]);
518
519
        return $this;
520
    }
521
522
    /**
523
     * Alias that always sets $withTimezone to true
524
     * @see addTimestamps
525
     *
526
     * @param string|null $createdAt Alternate name for the created_at column
527 1
     * @param string|null $updatedAt Alternate name for the updated_at column
528
     *
529 1
     * @return \Phinx\Db\Table
530 1
     */
531 1
    public function addTimestampsWithTimezone($createdAt = null, $updatedAt = null)
532 1
    {
533
        $this->addTimestamps($createdAt, $updatedAt, true);
534
535 1
        return $this;
536
    }
537
538 1
    /**
539
     * Insert data into the table.
540
     *
541
     * @param array $data array of data in the form:
542
     *              array(
543
     *                  array("col1" => "value1", "col2" => "anotherValue1"),
544
     *                  array("col2" => "value2", "col2" => "anotherValue2"),
545
     *              )
546
     *              or array("col1" => "value1", "col2" => "anotherValue1")
547
     *
548 1
     * @return \Phinx\Db\Table
549
     */
550 1
    public function insert($data)
551
    {
552
        // handle array of array situations
553
        if (isset($data[0]) && is_array($data[0])) {
554
            foreach ($data as $row) {
555
                $this->data[] = $row;
556
            }
557
558
            return $this;
559
        }
560
        $this->data[] = $data;
561 15
562
        return $this;
563 15
    }
564 15
565 15
    /**
566 15
     * Creates a table from the object instance.
567
     *
568 15
     * @return void
569 15
     */
570 15
    public function create()
571
    {
572 15
        $this->executeActions(false);
573
        $this->saveData();
574 15
        $this->reset(); // reset pending changes
575
    }
576
577
    /**
578
     * Updates a table from the object instance.
579
     *
580
     * @throws \RuntimeException
581
     * @return void
582
     */
583
    public function update()
584
    {
585
        $this->executeActions(true);
586
        $this->saveData();
587
        $this->reset(); // reset pending changes
588
    }
589 17
590
    /**
591
     * Commit the pending data waiting for insertion.
592 17
     *
593 11
     * @return void
594 11
     */
595 11
    public function saveData()
596 11
    {
597
        $rows = $this->getData();
598 8
        if (empty($rows)) {
599 8
            return;
600
        }
601
602
        $bulk = true;
603
        $row = current($rows);
604
        $c = array_keys($row);
605
        foreach ($this->getData() as $row) {
606
            $k = array_keys($row);
607 196
            if ($k != $c) {
608
                $bulk = false;
609 196
                break;
610 196
            }
611 196
        }
612 196
613
        if ($bulk) {
614
            $this->getAdapter()->bulkinsert($this->table, $this->getData());
615
        } else {
616
            foreach ($this->getData() as $row) {
617
                $this->getAdapter()->insert($this->table, $row);
618
            }
619
        }
620 46
621
        $this->resetData();
622 46
    }
623
624
    /**
625
     * Immediately truncates the table. This operation cannot be undone
626
     *
627 46
     * @return void
628 38
     */
629 46
    public function truncate()
630
    {
631 46
        $this->getAdapter()->truncateTable($this->getName());
632 6
    }
633 46
634
    /**
635 46
     * Commits the table changes.
636 3
     *
637 46
     * If the table doesn't exist it is created otherwise it is updated.
638
     *
639 46
     * @return void
640 46
     */
641 46
    public function save()
642
    {
643
        if ($this->exists()) {
644
            $this->update(); // update the table
645
        } else {
646
            $this->create(); // create the table
647
        }
648 196
    }
649
650 196
    /**
651 196
     * Executes all the pending actions for this table
652 192
     *
653
     * @param bool $exists Whether or not the table existed prior to executing this method
654
     * @return void
655 12
     */
656 12
    protected function executeActions($exists)
657 12
    {
658 12
        // Renaming a table is tricky, specially when running a reversible migration
659 12
        // down. We will just assume the table already exists if the user commands a
660 12
        // table rename.
661 1
        $renamed = collection($this->actions->getActions())
662 1
            ->filter(function ($action) {
663
                return $action instanceof RenameTable;
664 12
            })
665
            ->first();
666 12
667 11
        if ($renamed) {
668 11
            $exists = true;
669 1
        }
670 1
671 1
        // If the table does not exist, the last command in the chain needs to be
672
        // a CreateTable action.
673 12
        if (!$exists) {
674
            $this->actions->addAction(new CreateTable($this->table));
675
        }
676
677
        $plan = new Plan($this->actions);
678
        $plan->execute($this->getAdapter());
0 ignored issues
show
Bug introduced by
It seems like $this->getAdapter() can be null; however, execute() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
679
    }
680
}
681