Completed
Pull Request — master (#1414)
by
unknown
02:59
created

Table::resetData()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
ccs 0
cts 0
cp 0
cc 1
nc 1
nop 0
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 Constructor.
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 have pending actions?
151
     *
152
     * @return bool
153
     */
154
    public function hasPendingActions() {
155 225
        return count($this->actions->getActions()) > 0 || count($this->data) > 0;
156
    }
157 225
158
    /**
159
     * Does the table exist?
160
     *
161
     * @return bool
162
     */
163
    public function exists()
164
    {
165 195
        return $this->getAdapter()->hasTable($this->getName());
166
    }
167 195
168
    /**
169
     * Drops the database table.
170
     *
171
     * @return \Phinx\Db\Table
172
     */
173
    public function drop()
174
    {
175 1
        $this->actions->addAction(new DropTable($this->table));
176
177 1
        return $this;
178 1
    }
179
180
    /**
181
     * Renames the database table.
182
     *
183
     * @param string $newTableName New Table Name
184
     * @return \Phinx\Db\Table
185
     */
186 3
    public function rename($newTableName)
187
    {
188 3
        $this->actions->addAction(new RenameTable($this->table, $newTableName));
189 3
190 3
        return $this;
191
    }
192
193
    /**
194
     * Gets an array of the table columns.
195
     *
196
     * @return \Phinx\Db\Table\Column[]
197
     */
198
    public function getColumns()
199
    {
200
        return $this->getAdapter()->getColumns($this->getName());
201
    }
202
203
    /**
204
     * Gets a table column if it exists.
205
     *
206
     * @param string $name Column name
207
     * @return \Phinx\Db\Table\Column|null
208
     */
209
    public function getColumn($name)
210
    {
211 10
        $columns = array_filter(
212
            $this->getColumns(),
213 10
            function ($column) use ($name) {
214
                return $column->getName() === $name;
215
            }
216
        );
217
218
        return array_pop($columns);
219
    }
220
221
    /**
222 196
     * Sets an array of data to be inserted.
223
     *
224 196
     * @param array $data Data
225 196
     * @return \Phinx\Db\Table
226
     */
227
    public function setData($data)
228
    {
229
        $this->data = $data;
230
231
        return $this;
232
    }
233 204
234
    /**
235 204
     * Gets the data waiting to be inserted.
236
     *
237
     * @return array
238
     */
239
    public function getData()
240
    {
241
        return $this->data;
242
    }
243
244 196
    /**
245
     * Resets all of the pending data to be inserted
246 196
     *
247 196
     * @return void
248
     */
249
    public function resetData()
250
    {
251
        $this->setData([]);
252
    }
253
254
    /**
255 191
     * Resets all of the pending table changes.
256
     *
257 191
     * @return void
258
     */
259
    public function reset()
260
    {
261
        $this->actions = new Intent();
262
        $this->resetData();
263
    }
264
265
    /**
266 196
     * Add a table column.
267
     *
268 196
     * Type can be: string, text, integer, float, decimal, datetime, timestamp,
269 196
     * time, date, binary, boolean.
270
     *
271
     * Valid options can be: limit, default, null, precision or scale.
272
     *
273
     * @param string|\Phinx\Db\Table\Column $columnName Column Name
274
     * @param string|\Phinx\Util\Literal $type Column Type
275
     * @param array $options Column Options
276
     * @throws \RuntimeException
277 192
     * @throws \InvalidArgumentException
278
     * @return \Phinx\Db\Table
279 192
     */
280
    public function addColumn($columnName, $type = null, $options = [])
281
    {
282 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...
283
            $action = new AddColumn($this->table, $columnName);
284
        } else {
285
            $action = AddColumn::build($this->table, $columnName, $type, $options);
286
        }
287
288 196
        // Delegate to Adapters to check column type
289
        if (!$this->getAdapter()->isValidColumnType($action->getColumn())) {
290 196
            throw new \InvalidArgumentException(sprintf(
291 196
                'An invalid column type "%s" was specified for column "%s".',
292
                $type,
293
                $action->getColumn()->getName()
294
            ));
295
        }
296
297
        $this->actions->addAction($action);
298
299 197
        return $this;
300
    }
301 197
302
    /**
303
     * Remove a table column.
304
     *
305
     * @param string $columnName Column Name
306
     * @return \Phinx\Db\Table
307
     */
308
    public function removeColumn($columnName)
309 196
    {
310
        $action = RemoveColumn::build($this->table, $columnName);
311 196
        $this->actions->addAction($action);
312 196
313 196
        return $this;
314 196
    }
315 196
316
    /**
317
     * Rename a table column.
318
     *
319
     * @param string $oldName Old Column Name
320
     * @param string $newName New Column Name
321
     * @return \Phinx\Db\Table
322
     */
323
    public function renameColumn($oldName, $newName)
324
    {
325
        $action = RenameColumn::build($this->table, $oldName, $newName);
326
        $this->actions->addAction($action);
327
328
        return $this;
329
    }
330
331
    /**
332 210
     * Change a table column type.
333
     *
334
     * @param string        $columnName    Column Name
335 210
     * @param string|\Phinx\Db\Table\Column|\Phinx\Util\Literal $newColumnType New Column Type
336 1
     * @param array         $options       Options
337
     * @return \Phinx\Db\Table
338
     */
339
    public function changeColumn($columnName, $newColumnType, array $options = [])
340 209
    {
341 207 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...
342 207
            $action = new ChangeColumn($this->table, $columnName, $newColumnType);
343 207
        } else {
344 207
            $action = ChangeColumn::build($this->table, $columnName, $newColumnType, $options);
345 207
        }
346 2
        $this->actions->addAction($action);
347
348
        return $this;
349
    }
350 209
351 1
    /**
352 1
     * Checks to see if a column exists.
353 1
     *
354 1
     * @param string $columnName Column Name
355 1
     * @return bool
356
     */
357
    public function hasColumn($columnName)
358 208
    {
359 208
        return $this->getAdapter()->hasColumn($this->getName(), $columnName);
360
    }
361
362
    /**
363
     * Add an index to a database table.
364
     *
365
     * In $options you can specific unique = true/false or name (index name).
366
     *
367
     * @param string|array|\Phinx\Db\Table\Index $columns Table Column(s)
368 1
     * @param array $options Index Options
369
     * @return \Phinx\Db\Table
370 1
     */
371 1
    public function addIndex($columns, array $options = [])
372
    {
373
        $action = AddIndex::build($this->table, $columns, $options);
374
        $this->actions->addAction($action);
375
376
        return $this;
377
    }
378
379
    /**
380
     * Removes the given index from a table.
381 4
     *
382
     * @param array $columns Columns
383 4
     * @return \Phinx\Db\Table
384 4
     */
385
    public function removeIndex(array $columns)
386
    {
387
        $action = DropIndex::build($this->table, $columns);
388
        $this->actions->addAction($action);
389
390
        return $this;
391
    }
392
393
    /**
394
     * Removes the given index identified by its name from a table.
395 17
     *
396
     * @param string $name Index name
397
     * @return \Phinx\Db\Table
398 17
     */
399 4
    public function removeIndexByName($name)
400 4
    {
401 4
        $action = DropIndex::buildFromName($this->table, $name);
402 4
        $this->actions->addAction($action);
403 13
404
        return $this;
405
    }
406
407 17
    /**
408 15
     * Checks to see if an index exists.
409 15
     *
410
     * @param string|array $columns Columns
411 17
     * @return bool
412 17
     */
413
    public function hasIndex($columns)
414
    {
415
        return $this->getAdapter()->hasIndex($this->getName(), $columns);
416
    }
417
418
    /**
419
     * Checks to see if an index specified by name exists.
420
     *
421 89
     * @param string $indexName
422
     * @return bool
423 89
     */
424
    public function hasIndexByName($indexName)
425
    {
426
        return $this->getAdapter()->hasIndexByName($this->getName(), $indexName);
427
    }
428
429
    /**
430
     * Add a foreign key to a database table.
431
     *
432
     * In $options you can specify on_delete|on_delete = cascade|no_action ..,
433
     * on_update, constraint = constraint name.
434
     *
435 29
     * @param string|array $columns Columns
436
     * @param string|\Phinx\Db\Table $referencedTable   Referenced Table
437
     * @param string|array $referencedColumns Referenced Columns
438 29
     * @param array $options Options
439 28
     * @return \Phinx\Db\Table
440 28
     */
441 22 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...
442 22
    {
443 28
        $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 441 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 441 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...
444 28
        $this->actions->addAction($action);
445 28
446 1
        return $this;
447
    }
448
449 29
    /**
450 29
     * Add a foreign key to a database table with a given name.
451
     *
452
     * In $options you can specify on_delete|on_delete = cascade|no_action ..,
453
     * on_update, constraint = constraint name.
454
     *
455
     * @param string $name The constraint name
456
     * @param string|array $columns Columns
457
     * @param string|\Phinx\Db\Table $referencedTable   Referenced Table
458
     * @param string|array $referencedColumns Referenced Columns
459 1
     * @param array $options Options
460
     * @return \Phinx\Db\Table
461 1
     */
462 1 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...
463
    {
464
        $action = AddForeignKey::build(
465
            $this->table,
466
            $columns,
0 ignored issues
show
Bug introduced by
It seems like $columns defined by parameter $columns on line 462 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...
467
            $referencedTable,
0 ignored issues
show
Bug introduced by
It seems like $referencedTable defined by parameter $referencedTable on line 462 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...
468
            $referencedColumns,
469
            $options,
470
            $name
471 1
        );
472
        $this->actions->addAction($action);
473 1
474 1
        return $this;
475
    }
476
477
    /**
478
     * Removes the given foreign key from the table.
479
     *
480
     * @param string|array $columns    Column(s)
481
     * @param null|string  $constraint Constraint names
482
     * @return \Phinx\Db\Table
483
     */
484 12
    public function dropForeignKey($columns, $constraint = null)
485
    {
486 12
        $action = DropForeignKey::build($this->table, $columns, $constraint);
0 ignored issues
show
Bug introduced by
It seems like $columns defined by parameter $columns on line 484 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...
487
        $this->actions->addAction($action);
488
489
        return $this;
490
    }
491
492
    /**
493
     * Checks to see if a foreign key exists.
494
     *
495
     * @param  string|array $columns    Column(s)
496
     * @param  null|string  $constraint Constraint names
497
     * @return bool
498
     */
499
    public function hasForeignKey($columns, $constraint = null)
500
    {
501 8
        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...
502
    }
503 8
504 4
    /**
505 4
     * Add timestamp columns created_at and updated_at to the table.
506 8
     *
507 8
     * @param string|null $createdAt    Alternate name for the created_at column
508
     * @param string|null $updatedAt    Alternate name for the updated_at column
509
     * @param bool        $withTimezone Whether to set the timezone option on the added columns
510 8
     *
511
     * @return \Phinx\Db\Table
512 8
     */
513 8
    public function addTimestamps($createdAt = 'created_at', $updatedAt = 'updated_at', $withTimezone = false)
514 8
    {
515 8
        $createdAt = is_null($createdAt) ? 'created_at' : $createdAt;
516
        $updatedAt = is_null($updatedAt) ? 'updated_at' : $updatedAt;
517 8
518
        $this->addColumn($createdAt, 'timestamp', [
519
                   'default' => 'CURRENT_TIMESTAMP',
520
                   'update' => '',
521
                   'timezone' => $withTimezone,
522
             ])
523
             ->addColumn($updatedAt, 'timestamp', [
524
                 'null' => true,
525
                 'default' => null,
526
                 'timezone' => $withTimezone,
527 1
             ]);
528
529 1
        return $this;
530 1
    }
531 1
532 1
    /**
533
     * Alias that always sets $withTimezone to true
534
     * @see addTimestamps
535 1
     *
536
     * @param string|null $createdAt Alternate name for the created_at column
537
     * @param string|null $updatedAt Alternate name for the updated_at column
538 1
     *
539
     * @return \Phinx\Db\Table
540
     */
541
    public function addTimestampsWithTimezone($createdAt = null, $updatedAt = null)
542
    {
543
        $this->addTimestamps($createdAt, $updatedAt, true);
544
545
        return $this;
546
    }
547
548 1
    /**
549
     * Insert data into the table.
550 1
     *
551
     * @param array $data array of data in the form:
552
     *              array(
553
     *                  array("col1" => "value1", "col2" => "anotherValue1"),
554
     *                  array("col2" => "value2", "col2" => "anotherValue2"),
555
     *              )
556
     *              or array("col1" => "value1", "col2" => "anotherValue1")
557
     *
558
     * @return \Phinx\Db\Table
559
     */
560
    public function insert($data)
561 15
    {
562
        // handle array of array situations
563 15
        if (isset($data[0]) && is_array($data[0])) {
564 15
            foreach ($data as $row) {
565 15
                $this->data[] = $row;
566 15
            }
567
568 15
            return $this;
569 15
        }
570 15
        $this->data[] = $data;
571
572 15
        return $this;
573
    }
574 15
575
    /**
576
     * Creates a table from the object instance.
577
     *
578
     * @return void
579
     */
580
    public function create()
581
    {
582
        $this->executeActions(false);
583
        $this->saveData();
584
        $this->reset(); // reset pending changes
585
    }
586
587
    /**
588
     * Updates a table from the object instance.
589 17
     *
590
     * @throws \RuntimeException
591
     * @return void
592 17
     */
593 11
    public function update()
594 11
    {
595 11
        $this->executeActions(true);
596 11
        $this->saveData();
597
        $this->reset(); // reset pending changes
598 8
    }
599 8
600
    /**
601
     * Commit the pending data waiting for insertion.
602
     *
603
     * @return void
604
     */
605
    public function saveData()
606
    {
607 196
        $rows = $this->getData();
608
        if (empty($rows)) {
609 196
            return;
610 196
        }
611 196
612 196
        $bulk = true;
613
        $row = current($rows);
614
        $c = array_keys($row);
615
        foreach ($this->getData() as $row) {
616
            $k = array_keys($row);
617
            if ($k != $c) {
618
                $bulk = false;
619
                break;
620 46
            }
621
        }
622 46
623
        if ($bulk) {
624
            $this->getAdapter()->bulkinsert($this->table, $this->getData());
625
        } else {
626
            foreach ($this->getData() as $row) {
627 46
                $this->getAdapter()->insert($this->table, $row);
628 38
            }
629 46
        }
630
631 46
        $this->resetData();
632 6
    }
633 46
634
    /**
635 46
     * Immediately truncates the table. This operation cannot be undone
636 3
     *
637 46
     * @return void
638
     */
639 46
    public function truncate()
640 46
    {
641 46
        $this->getAdapter()->truncateTable($this->getName());
642
    }
643
644
    /**
645
     * Commits the table changes.
646
     *
647
     * If the table doesn't exist it is created otherwise it is updated.
648 196
     *
649
     * @return void
650 196
     */
651 196
    public function save()
652 192
    {
653
        if ($this->exists()) {
654
            $this->update(); // update the table
655 12
        } else {
656 12
            $this->create(); // create the table
657 12
        }
658 12
    }
659 12
660 12
    /**
661 1
     * Executes all the pending actions for this table
662 1
     *
663
     * @param bool $exists Whether or not the table existed prior to executing this method
664 12
     * @return void
665
     */
666 12
    protected function executeActions($exists)
667 11
    {
668 11
        // Renaming a table is tricky, specially when running a reversible migration
669 1
        // down. We will just assume the table already exists if the user commands a
670 1
        // table rename.
671 1
        $renamed = collection($this->actions->getActions())
672
            ->filter(function ($action) {
673 12
                return $action instanceof RenameTable;
674
            })
675
            ->first();
676
677
        if ($renamed) {
678
            $exists = true;
679
        }
680 2
681
        // If the table does not exist, the last command in the chain needs to be
682 2
        // a CreateTable action.
683 2
        if (!$exists) {
684
            $this->actions->addAction(new CreateTable($this->table));
685
        }
686
687
        $plan = new Plan($this->actions);
688
        $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...
689
    }
690
}
691