InsertMultiple::getSyntaxWithSelect()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 2
c 1
b 0
f 0
dl 0
loc 5
rs 10
cc 1
nc 1
nop 0
1
<?php
2
/**
3
 * Created by PhpStorm.
4
 * User: Adrian Dumitru
5
 * Date: 7/9/2017
6
 * Time: 10:41 AM
7
 */
8
9
namespace Qpdb\QueryBuilder\Traits;
10
11
12
use Qpdb\QueryBuilder\Dependencies\QueryException;
13
use Qpdb\QueryBuilder\Dependencies\QueryHelper;
14
use Qpdb\QueryBuilder\Dependencies\QueryStructure;
15
use Qpdb\QueryBuilder\Statements\QuerySelect;
16
17
/**
18
 * Trait InsertMultiple
19
 * @package Qpdb\QueryBuilder\Traits
20
 * @property QueryStructure $queryStructure
21
 */
22
trait InsertMultiple
23
{
24
25
	/**
26
	 * @param $fieldsList
27
	 * @param array $rowsForInsert
28
	 * @return $this
29
	 * @throws QueryException
30
	 */
31
	public function fromArray( $fieldsList, array $rowsForInsert )
32
	{
33
		$this->setFieldsList( $fieldsList );
34
35
		foreach ( $rowsForInsert as $row )
36
			$this->addSingleRow( $row );
37
38
		return $this;
39
	}
40
41
42
	/**
43
	 * @param $fieldsList
44
	 * @param QuerySelect $query
45
	 * @return $this
46
	 * @throws QueryException
47
	 */
48
	public function fromQuerySelect( $fieldsList, QuerySelect $query )
49
	{
50
		$this->setFieldsList( $fieldsList );
51
52
		foreach ( $query->getBindParams() as $key => $value )
53
			$this->queryStructure->setParams( $key, $value );
54
55
		$this->queryStructure->replaceElement( QueryStructure::SET_FIELDS, $query );
56
57
		return $this;
58
	}
59
60
61
	/**
62
	 * @param string|array $fieldList
63
	 * @throws QueryException
64
	 */
65
	private function setFieldsList( $fieldList )
66
	{
67
		if ( !is_array( $fieldList ) )
68
			$fieldList = QueryHelper::explode( $fieldList );
69
70
		$this->queryStructure->replaceElement( QueryStructure::FIELDS, $fieldList );
71
72
	}
73
74
	/**
75
	 * @param array $rowValues
76
	 * @return $this
77
	 * @throws QueryException
78
	 */
79
	private function addSingleRow( array $rowValues )
80
	{
81
82
		if ( $this->getNumberOfFields() !== count( $rowValues ) )
83
			throw new QueryException( 'Ivalid number of fields.', QueryException::QUERY_ERROR_INVALID_FIELDS_COUNT );
84
85
		$pdoRowValues = array();
86
87
		foreach ( $rowValues as $value )
88
			$pdoRowValues[] = $this->queryStructure->bindParam( 'value', $value );
89
90
		$pdoRowValuesString = '( ' . QueryHelper::implode( $pdoRowValues, ', ' ) . ' )';
91
92
		$this->queryStructure->setElement( QueryStructure::SET_FIELDS, $pdoRowValuesString );
93
94
		return $this;
95
	}
96
97
	/**
98
	 * @return string
99
	 */
100
	private function getInsertMultipleRowsSyntax()
101
	{
102
		if ( is_a( $this->queryStructure->getElement( QueryStructure::SET_FIELDS ), QuerySelect::class ) )
103
			return $this->getSyntaxWithSelect();
104
105
		$fields = '( ' . QueryHelper::implode( $this->queryStructure->getElement( QueryStructure::FIELDS ), ', ' ) . ' )';
106
		$values = QueryHelper::implode( $this->queryStructure->getElement( QueryStructure::SET_FIELDS ), ', ' );
107
108
		return $fields . ' VALUES ' . $values;
109
	}
110
111
112
	/**
113
	 * @return string
114
	 */
115
	private function getSyntaxWithSelect()
116
	{
117
		$fields = '( ' . QueryHelper::implode( $this->queryStructure->getElement( QueryStructure::FIELDS ), ', ' ) . ' )';
118
119
		return $fields . ' ' . $this->queryStructure->getElement( QueryStructure::SET_FIELDS )->getSyntax();
120
	}
121
122
	/**
123
	 * @return int
124
	 */
125
	private function getNumberOfFields()
126
	{
127
		return count( $this->queryStructure->getElement( QueryStructure::FIELDS ) );
128
	}
129
130
131
}