Completed
Branch TYPO3V8 (1e9d52)
by Tomas Norre
12:04
created

QueryBuilder::values()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 9
rs 9.9666
c 0
b 0
f 0
cc 1
nc 1
nop 2
1
<?php
2
declare(strict_types = 1);
3
4
namespace Aoe\AoeDbSequenzer\Xclass;
5
6
/*
7
 * This file xclasses and extends a part of the TYPO3 CMS project.
8
 */
9
10
use Aoe\AoeDbSequenzer\Sequenzer;
11
use Aoe\AoeDbSequenzer\Service\Typo3Service;
12
use TYPO3\CMS\Core\Database\Query\QueryBuilder as CoreQueryBuilder;
13
14
/**
15
 * @package Aoe\AoeDbSequenzer\Xclass
16
 */
17
class QueryBuilder extends CoreQueryBuilder
18
{
19
    /**
20
     * @var Typo3Service
21
     */
22
    private $typo3Service;
23
24
    /**
25
     * Sets a new value for a column in a bulk update query.
26
     *
27
     * @param string $key                  The column to set.
28
     * @param string $value                The value, expression, placeholder, etc.
29
     * @param bool   $createNamedParameter Automatically create a named parameter for the value
30
     *
31
     * @return QueryBuilder This QueryBuilder instance.
32
     */
33
    public function set(string $key, $value, bool $createNamedParameter = true): CoreQueryBuilder
34
    {
35
        if ('uid' === $key && $this->getTypo3Service()->needsSequenzer($this->getTableName())) {
36
            throw new \InvalidArgumentException('no uid allowed in update statement!', 1564122229);
37
        }
38
39
        parent::set($key, $value, $createNamedParameter);
40
41
        return $this;
42
    }
43
44
    /**
45
     * Specifies values for an insert query indexed by column names.
46
     * Replaces any previous values, if any.
47
     *
48
     * @param array $values                The values to specify for the insert query indexed by column names.
49
     * @param bool  $createNamedParameters Automatically create named parameters for all values
50
     *
51
     * @return QueryBuilder This QueryBuilder instance.
52
     */
53
    public function values(array $values, bool $createNamedParameters = true): CoreQueryBuilder
54
    {
55
        parent::values(
56
            $this->getTypo3Service()->modifyInsertFields($this->getTableName(), $values),
57
            $createNamedParameters
58
        );
59
60
        return $this;
61
    }
62
63
64
    /**
65
     * create instance of Typo3Service by lazy-loading
66
     *
67
     * Why we do this?
68
     * Because some unittests backup the variable $GLOBALS (and so, also the variable $GLOBALS['TYPO3_DB']), which means, that this
69
     * object/class will be serialized/unserialized, so the instance of Typo3Service will be null after unserialization!
70
     *
71
     * @return Typo3Service
72
     */
73
    protected function getTypo3Service()
74
    {
75
        if (false === isset($this->typo3Service)) {
76
            $this->typo3Service = new Typo3Service(new Sequenzer());
77
        }
78
79
        return $this->typo3Service;
80
    }
81
82
    /**
83
     * Determines the defined table name without quotation marks (`).
84
     *
85
     * @return string
86
     */
87
    protected function getTableName()
88
    {
89
        $mark = '`';
90
        $tableName = $this->concreteQueryBuilder->getQueryPart('from')['table'];
91
        if (!empty($tableName) && $tableName[0] === $mark && $tableName[strlen($tableName) - 1] === $mark) {
92
            return str_replace($mark, '', $tableName);
93
        }
94
95
        return $tableName;
96
    }
97
}
98