Completed
Push — 4.0 ( 05ee2e...a7db85 )
by David
05:11
created
src/Mouf/Database/TDBM/DbRow.php 1 patch
Indentation   +363 added lines, -363 removed lines patch added patch discarded remove patch
@@ -27,163 +27,163 @@  discard block
 block discarded – undo
27 27
  */
28 28
 class DbRow
29 29
 {
30
-    /**
31
-     * The service this object is bound to.
32
-     *
33
-     * @var TDBMService
34
-     */
35
-    protected $tdbmService;
36
-
37
-    /**
38
-     * The object containing this db row.
39
-     *
40
-     * @var AbstractTDBMObject
41
-     */
42
-    private $object;
43
-
44
-    /**
45
-     * The name of the table the object if issued from.
46
-     *
47
-     * @var string
48
-     */
49
-    private $dbTableName;
50
-
51
-    /**
52
-     * The array of columns returned from database.
53
-     *
54
-     * @var array
55
-     */
56
-    private $dbRow = array();
57
-
58
-    /**
59
-     * @var AbstractTDBMObject[]
60
-     */
61
-    private $references = array();
62
-
63
-    /**
64
-     * One of TDBMObjectStateEnum::STATE_NEW, TDBMObjectStateEnum::STATE_NOT_LOADED, TDBMObjectStateEnum::STATE_LOADED, TDBMObjectStateEnum::STATE_DELETED.
65
-     * $status = TDBMObjectStateEnum::STATE_NEW when a new object is created with DBMObject:getNewObject.
66
-     * $status = TDBMObjectStateEnum::STATE_NOT_LOADED when the object has been retrieved with getObject but when no data has been accessed in it yet.
67
-     * $status = TDBMObjectStateEnum::STATE_LOADED when the object is cached in memory.
68
-     *
69
-     * @var string
70
-     */
71
-    private $status;
72
-
73
-    /**
74
-     * The values of the primary key.
75
-     * This is set when the object is in "loaded" state.
76
-     *
77
-     * @var array An array of column => value
78
-     */
79
-    private $primaryKeys;
80
-
81
-    /**
82
-     * You should never call the constructor directly. Instead, you should use the
83
-     * TDBMService class that will create TDBMObjects for you.
84
-     *
85
-     * Used with id!=false when we want to retrieve an existing object
86
-     * and id==false if we want a new object
87
-     *
88
-     * @param AbstractTDBMObject $object      The object containing this db row.
89
-     * @param string             $table_name
90
-     * @param array              $primaryKeys
91
-     * @param TDBMService        $tdbmService
92
-     *
93
-     * @throws TDBMException
94
-     * @throws TDBMInvalidOperationException
95
-     */
96
-    public function __construct(AbstractTDBMObject $object, $table_name, array $primaryKeys = array(), TDBMService $tdbmService = null, array $dbRow = array())
97
-    {
98
-        $this->object = $object;
99
-        $this->dbTableName = $table_name;
100
-
101
-        $this->status = TDBMObjectStateEnum::STATE_DETACHED;
102
-
103
-        if ($tdbmService === null) {
104
-            if (!empty($primaryKeys)) {
105
-                throw new TDBMException('You cannot pass an id to the DbRow constructor without passing also a TDBMService.');
106
-            }
107
-        } else {
108
-            $this->tdbmService = $tdbmService;
109
-
110
-            if (!empty($primaryKeys)) {
111
-                $this->_setPrimaryKeys($primaryKeys);
112
-                if (!empty($dbRow)) {
113
-                    $this->dbRow = $dbRow;
114
-                    $this->status = TDBMObjectStateEnum::STATE_LOADED;
115
-                } else {
116
-                    $this->status = TDBMObjectStateEnum::STATE_NOT_LOADED;
117
-                }
118
-                $tdbmService->_addToCache($this);
119
-            } else {
120
-                $this->status = TDBMObjectStateEnum::STATE_NEW;
121
-                $this->tdbmService->_addToToSaveObjectList($this);
122
-            }
123
-        }
124
-    }
125
-
126
-    public function _attach(TDBMService $tdbmService)
127
-    {
128
-        if ($this->status !== TDBMObjectStateEnum::STATE_DETACHED) {
129
-            throw new TDBMInvalidOperationException('Cannot attach an object that is already attached to TDBM.');
130
-        }
131
-        $this->tdbmService = $tdbmService;
132
-        $this->status = TDBMObjectStateEnum::STATE_NEW;
133
-        $this->tdbmService->_addToToSaveObjectList($this);
134
-    }
135
-
136
-    /**
137
-     * Sets the state of the TDBM Object
138
-     * One of TDBMObjectStateEnum::STATE_NEW, TDBMObjectStateEnum::STATE_NOT_LOADED, TDBMObjectStateEnum::STATE_LOADED, TDBMObjectStateEnum::STATE_DELETED.
139
-     * $status = TDBMObjectStateEnum::STATE_NEW when a new object is created with DBMObject:getNewObject.
140
-     * $status = TDBMObjectStateEnum::STATE_NOT_LOADED when the object has been retrieved with getObject but when no data has been accessed in it yet.
141
-     * $status = TDBMObjectStateEnum::STATE_LOADED when the object is cached in memory.
142
-     *
143
-     * @param string $state
144
-     */
145
-    public function _setStatus($state)
146
-    {
147
-        $this->status = $state;
148
-    }
149
-
150
-    /**
151
-     * This is an internal method. You should not call this method yourself. The TDBM library will do it for you.
152
-     * If the object is in state 'not loaded', this method performs a query in database to load the object.
153
-     *
154
-     * A TDBMException is thrown is no object can be retrieved (for instance, if the primary key specified
155
-     * cannot be found).
156
-     */
157
-    public function _dbLoadIfNotLoaded()
158
-    {
159
-        if ($this->status == TDBMObjectStateEnum::STATE_NOT_LOADED) {
160
-            $connection = $this->tdbmService->getConnection();
161
-
162
-            /// buildFilterFromFilterBag($filter_bag)
163
-            list($sql_where, $parameters) = $this->tdbmService->buildFilterFromFilterBag($this->primaryKeys);
164
-
165
-            $sql = 'SELECT * FROM '.$connection->quoteIdentifier($this->dbTableName).' WHERE '.$sql_where;
166
-            $result = $connection->executeQuery($sql, $parameters);
167
-
168
-            if ($result->rowCount() === 0) {
169
-                throw new TDBMException("Could not retrieve object from table \"$this->dbTableName\" using filter \"\".");
170
-            }
171
-
172
-            $this->dbRow = $result->fetch(\PDO::FETCH_ASSOC);
173
-
174
-            $result->closeCursor();
175
-
176
-            $this->status = TDBMObjectStateEnum::STATE_LOADED;
177
-        }
178
-    }
179
-
180
-    public function get($var)
181
-    {
182
-        $this->_dbLoadIfNotLoaded();
183
-
184
-        // Let's first check if the key exist.
185
-        if (!isset($this->dbRow[$var])) {
186
-            /*
30
+	/**
31
+	 * The service this object is bound to.
32
+	 *
33
+	 * @var TDBMService
34
+	 */
35
+	protected $tdbmService;
36
+
37
+	/**
38
+	 * The object containing this db row.
39
+	 *
40
+	 * @var AbstractTDBMObject
41
+	 */
42
+	private $object;
43
+
44
+	/**
45
+	 * The name of the table the object if issued from.
46
+	 *
47
+	 * @var string
48
+	 */
49
+	private $dbTableName;
50
+
51
+	/**
52
+	 * The array of columns returned from database.
53
+	 *
54
+	 * @var array
55
+	 */
56
+	private $dbRow = array();
57
+
58
+	/**
59
+	 * @var AbstractTDBMObject[]
60
+	 */
61
+	private $references = array();
62
+
63
+	/**
64
+	 * One of TDBMObjectStateEnum::STATE_NEW, TDBMObjectStateEnum::STATE_NOT_LOADED, TDBMObjectStateEnum::STATE_LOADED, TDBMObjectStateEnum::STATE_DELETED.
65
+	 * $status = TDBMObjectStateEnum::STATE_NEW when a new object is created with DBMObject:getNewObject.
66
+	 * $status = TDBMObjectStateEnum::STATE_NOT_LOADED when the object has been retrieved with getObject but when no data has been accessed in it yet.
67
+	 * $status = TDBMObjectStateEnum::STATE_LOADED when the object is cached in memory.
68
+	 *
69
+	 * @var string
70
+	 */
71
+	private $status;
72
+
73
+	/**
74
+	 * The values of the primary key.
75
+	 * This is set when the object is in "loaded" state.
76
+	 *
77
+	 * @var array An array of column => value
78
+	 */
79
+	private $primaryKeys;
80
+
81
+	/**
82
+	 * You should never call the constructor directly. Instead, you should use the
83
+	 * TDBMService class that will create TDBMObjects for you.
84
+	 *
85
+	 * Used with id!=false when we want to retrieve an existing object
86
+	 * and id==false if we want a new object
87
+	 *
88
+	 * @param AbstractTDBMObject $object      The object containing this db row.
89
+	 * @param string             $table_name
90
+	 * @param array              $primaryKeys
91
+	 * @param TDBMService        $tdbmService
92
+	 *
93
+	 * @throws TDBMException
94
+	 * @throws TDBMInvalidOperationException
95
+	 */
96
+	public function __construct(AbstractTDBMObject $object, $table_name, array $primaryKeys = array(), TDBMService $tdbmService = null, array $dbRow = array())
97
+	{
98
+		$this->object = $object;
99
+		$this->dbTableName = $table_name;
100
+
101
+		$this->status = TDBMObjectStateEnum::STATE_DETACHED;
102
+
103
+		if ($tdbmService === null) {
104
+			if (!empty($primaryKeys)) {
105
+				throw new TDBMException('You cannot pass an id to the DbRow constructor without passing also a TDBMService.');
106
+			}
107
+		} else {
108
+			$this->tdbmService = $tdbmService;
109
+
110
+			if (!empty($primaryKeys)) {
111
+				$this->_setPrimaryKeys($primaryKeys);
112
+				if (!empty($dbRow)) {
113
+					$this->dbRow = $dbRow;
114
+					$this->status = TDBMObjectStateEnum::STATE_LOADED;
115
+				} else {
116
+					$this->status = TDBMObjectStateEnum::STATE_NOT_LOADED;
117
+				}
118
+				$tdbmService->_addToCache($this);
119
+			} else {
120
+				$this->status = TDBMObjectStateEnum::STATE_NEW;
121
+				$this->tdbmService->_addToToSaveObjectList($this);
122
+			}
123
+		}
124
+	}
125
+
126
+	public function _attach(TDBMService $tdbmService)
127
+	{
128
+		if ($this->status !== TDBMObjectStateEnum::STATE_DETACHED) {
129
+			throw new TDBMInvalidOperationException('Cannot attach an object that is already attached to TDBM.');
130
+		}
131
+		$this->tdbmService = $tdbmService;
132
+		$this->status = TDBMObjectStateEnum::STATE_NEW;
133
+		$this->tdbmService->_addToToSaveObjectList($this);
134
+	}
135
+
136
+	/**
137
+	 * Sets the state of the TDBM Object
138
+	 * One of TDBMObjectStateEnum::STATE_NEW, TDBMObjectStateEnum::STATE_NOT_LOADED, TDBMObjectStateEnum::STATE_LOADED, TDBMObjectStateEnum::STATE_DELETED.
139
+	 * $status = TDBMObjectStateEnum::STATE_NEW when a new object is created with DBMObject:getNewObject.
140
+	 * $status = TDBMObjectStateEnum::STATE_NOT_LOADED when the object has been retrieved with getObject but when no data has been accessed in it yet.
141
+	 * $status = TDBMObjectStateEnum::STATE_LOADED when the object is cached in memory.
142
+	 *
143
+	 * @param string $state
144
+	 */
145
+	public function _setStatus($state)
146
+	{
147
+		$this->status = $state;
148
+	}
149
+
150
+	/**
151
+	 * This is an internal method. You should not call this method yourself. The TDBM library will do it for you.
152
+	 * If the object is in state 'not loaded', this method performs a query in database to load the object.
153
+	 *
154
+	 * A TDBMException is thrown is no object can be retrieved (for instance, if the primary key specified
155
+	 * cannot be found).
156
+	 */
157
+	public function _dbLoadIfNotLoaded()
158
+	{
159
+		if ($this->status == TDBMObjectStateEnum::STATE_NOT_LOADED) {
160
+			$connection = $this->tdbmService->getConnection();
161
+
162
+			/// buildFilterFromFilterBag($filter_bag)
163
+			list($sql_where, $parameters) = $this->tdbmService->buildFilterFromFilterBag($this->primaryKeys);
164
+
165
+			$sql = 'SELECT * FROM '.$connection->quoteIdentifier($this->dbTableName).' WHERE '.$sql_where;
166
+			$result = $connection->executeQuery($sql, $parameters);
167
+
168
+			if ($result->rowCount() === 0) {
169
+				throw new TDBMException("Could not retrieve object from table \"$this->dbTableName\" using filter \"\".");
170
+			}
171
+
172
+			$this->dbRow = $result->fetch(\PDO::FETCH_ASSOC);
173
+
174
+			$result->closeCursor();
175
+
176
+			$this->status = TDBMObjectStateEnum::STATE_LOADED;
177
+		}
178
+	}
179
+
180
+	public function get($var)
181
+	{
182
+		$this->_dbLoadIfNotLoaded();
183
+
184
+		// Let's first check if the key exist.
185
+		if (!isset($this->dbRow[$var])) {
186
+			/*
187 187
             // Unable to find column.... this is an error if the object has been retrieved from database.
188 188
             // If it's a new object, well, that may not be an error after all!
189 189
             // Let's check if the column does exist in the table
@@ -203,39 +203,39 @@  discard block
 block discarded – undo
203 203
             $str = "Could not find column \"$var\" in table \"$this->dbTableName\". Maybe you meant one of those columns: '".implode("', '",$result_array)."'";
204 204
 
205 205
             throw new TDBMException($str);*/
206
-            return;
207
-        }
208
-
209
-        $value = $this->dbRow[$var];
210
-        if ($value instanceof \DateTime) {
211
-            if (method_exists('DateTimeImmutable', 'createFromMutable')) { // PHP 5.6+ only
212
-                return \DateTimeImmutable::createFromMutable($value);
213
-            } else {
214
-                return new \DateTimeImmutable($value->format('c'));
215
-            }
216
-        }
217
-
218
-        return $this->dbRow[$var];
219
-    }
220
-
221
-    /**
222
-     * Returns true if a column is set, false otherwise.
223
-     *
224
-     * @param string $var
225
-     *
226
-     * @return bool
227
-     */
228
-    /*public function has($var) {
206
+			return;
207
+		}
208
+
209
+		$value = $this->dbRow[$var];
210
+		if ($value instanceof \DateTime) {
211
+			if (method_exists('DateTimeImmutable', 'createFromMutable')) { // PHP 5.6+ only
212
+				return \DateTimeImmutable::createFromMutable($value);
213
+			} else {
214
+				return new \DateTimeImmutable($value->format('c'));
215
+			}
216
+		}
217
+
218
+		return $this->dbRow[$var];
219
+	}
220
+
221
+	/**
222
+	 * Returns true if a column is set, false otherwise.
223
+	 *
224
+	 * @param string $var
225
+	 *
226
+	 * @return bool
227
+	 */
228
+	/*public function has($var) {
229 229
         $this->_dbLoadIfNotLoaded();
230 230
 
231 231
         return isset($this->dbRow[$var]);
232 232
     }*/
233 233
 
234
-    public function set($var, $value)
235
-    {
236
-        $this->_dbLoadIfNotLoaded();
234
+	public function set($var, $value)
235
+	{
236
+		$this->_dbLoadIfNotLoaded();
237 237
 
238
-        /*
238
+		/*
239 239
         // Ok, let's start by checking the column type
240 240
         $type = $this->db_connection->getColumnType($this->dbTableName, $var);
241 241
 
@@ -245,184 +245,184 @@  discard block
 block discarded – undo
245 245
         }
246 246
         */
247 247
 
248
-        /*if ($var == $this->getPrimaryKey() && isset($this->dbRow[$var]))
248
+		/*if ($var == $this->getPrimaryKey() && isset($this->dbRow[$var]))
249 249
             throw new TDBMException("Error! Changing primary key value is forbidden.");*/
250
-        $this->dbRow[$var] = $value;
251
-        if ($this->tdbmService !== null && $this->status === TDBMObjectStateEnum::STATE_LOADED) {
252
-            $this->status = TDBMObjectStateEnum::STATE_DIRTY;
253
-            $this->tdbmService->_addToToSaveObjectList($this);
254
-        }
255
-    }
256
-
257
-    /**
258
-     * @param string             $foreignKeyName
259
-     * @param AbstractTDBMObject $bean
260
-     */
261
-    public function setRef($foreignKeyName, AbstractTDBMObject $bean = null)
262
-    {
263
-        $this->references[$foreignKeyName] = $bean;
264
-
265
-        if ($this->tdbmService !== null && $this->status === TDBMObjectStateEnum::STATE_LOADED) {
266
-            $this->status = TDBMObjectStateEnum::STATE_DIRTY;
267
-            $this->tdbmService->_addToToSaveObjectList($this);
268
-        }
269
-    }
270
-
271
-    /**
272
-     * @param string $foreignKeyName A unique name for this reference
273
-     *
274
-     * @return AbstractTDBMObject|null
275
-     */
276
-    public function getRef($foreignKeyName)
277
-    {
278
-        if (isset($this->references[$foreignKeyName])) {
279
-            return $this->references[$foreignKeyName];
280
-        } elseif ($this->status === TDBMObjectStateEnum::STATE_NEW) {
281
-            // If the object is new and has no property, then it has to be empty.
282
-            return;
283
-        } else {
284
-            $this->_dbLoadIfNotLoaded();
285
-
286
-            // Let's match the name of the columns to the primary key values
287
-            $fk = $this->tdbmService->_getForeignKeyByName($this->dbTableName, $foreignKeyName);
288
-
289
-            $values = [];
290
-            foreach ($fk->getLocalColumns() as $column) {
291
-                $values[] = $this->dbRow[$column];
292
-            }
293
-
294
-            $filter = array_combine($this->tdbmService->getPrimaryKeyColumns($fk->getForeignTableName()), $values);
295
-
296
-            return $this->tdbmService->findObjectByPk($fk->getForeignTableName(), $filter, [], true);
297
-        }
298
-    }
299
-
300
-    /**
301
-     * Returns the name of the table this object comes from.
302
-     *
303
-     * @return string
304
-     */
305
-    public function _getDbTableName()
306
-    {
307
-        return $this->dbTableName;
308
-    }
309
-
310
-    /**
311
-     * Method used internally by TDBM. You should not use it directly.
312
-     * This method returns the status of the TDBMObject.
313
-     * This is one of TDBMObjectStateEnum::STATE_NEW, TDBMObjectStateEnum::STATE_NOT_LOADED, TDBMObjectStateEnum::STATE_LOADED, TDBMObjectStateEnum::STATE_DELETED.
314
-     * $status = TDBMObjectStateEnum::STATE_NEW when a new object is created with DBMObject:getNewObject.
315
-     * $status = TDBMObjectStateEnum::STATE_NOT_LOADED when the object has been retrieved with getObject but when no data has been accessed in it yet.
316
-     * $status = TDBMObjectStateEnum::STATE_LOADED when the object is cached in memory.
317
-     *
318
-     * @return string
319
-     */
320
-    public function _getStatus()
321
-    {
322
-        return $this->status;
323
-    }
324
-
325
-    /**
326
-     * Override the native php clone function for TDBMObjects.
327
-     */
328
-    public function __clone()
329
-    {
330
-        // Let's load the row (before we lose the ID!)
331
-        $this->_dbLoadIfNotLoaded();
332
-
333
-        //Let's set the status to detached
334
-        $this->status = TDBMObjectStateEnum::STATE_DETACHED;
335
-
336
-        $this->primaryKeys = [];
337
-
338
-        //Now unset the PK from the row
339
-        if ($this->tdbmService) {
340
-            $pk_array = $this->tdbmService->getPrimaryKeyColumns($this->dbTableName);
341
-            foreach ($pk_array as $pk) {
342
-                $this->dbRow[$pk] = null;
343
-            }
344
-        }
345
-    }
346
-
347
-    /**
348
-     * Returns raw database row.
349
-     *
350
-     * @return array
351
-     */
352
-    public function _getDbRow()
353
-    {
354
-        // Let's merge $dbRow and $references
355
-        $dbRow = $this->dbRow;
356
-
357
-        foreach ($this->references as $foreignKeyName => $reference) {
358
-            // Let's match the name of the columns to the primary key values
359
-            $fk = $this->tdbmService->_getForeignKeyByName($this->dbTableName, $foreignKeyName);
360
-            $refDbRows = $reference->_getDbRows();
361
-            $firstRefDbRow = reset($refDbRows);
362
-            $pkValues = array_values($firstRefDbRow->_getPrimaryKeys());
363
-            $localColumns = $fk->getLocalColumns();
364
-
365
-            for ($i = 0, $count = count($localColumns); $i < $count; ++$i) {
366
-                $dbRow[$localColumns[$i]] = $pkValues[$i];
367
-            }
368
-        }
369
-
370
-        return $dbRow;
371
-    }
372
-
373
-    /**
374
-     * Returns references array.
375
-     *
376
-     * @return AbstractTDBMObject[]
377
-     */
378
-    public function _getReferences()
379
-    {
380
-        return $this->references;
381
-    }
382
-
383
-    /**
384
-     * Returns the values of the primary key.
385
-     * This is set when the object is in "loaded" state.
386
-     *
387
-     * @return array
388
-     */
389
-    public function _getPrimaryKeys()
390
-    {
391
-        return $this->primaryKeys;
392
-    }
393
-
394
-    /**
395
-     * Sets the values of the primary key.
396
-     * This is set when the object is in "loaded" state.
397
-     *
398
-     * @param array $primaryKeys
399
-     */
400
-    public function _setPrimaryKeys(array $primaryKeys)
401
-    {
402
-        $this->primaryKeys = $primaryKeys;
403
-        foreach ($this->primaryKeys as $column => $value) {
404
-            $this->dbRow[$column] = $value;
405
-        }
406
-    }
407
-
408
-    /**
409
-     * Returns the TDBMObject this bean is associated to.
410
-     *
411
-     * @return AbstractTDBMObject
412
-     */
413
-    public function getTDBMObject()
414
-    {
415
-        return $this->object;
416
-    }
417
-
418
-    /**
419
-     * Sets the TDBMObject this bean is associated to.
420
-     * Only used when cloning.
421
-     *
422
-     * @param AbstractTDBMObject $object
423
-     */
424
-    public function setTDBMObject(AbstractTDBMObject $object)
425
-    {
426
-        $this->object = $object;
427
-    }
250
+		$this->dbRow[$var] = $value;
251
+		if ($this->tdbmService !== null && $this->status === TDBMObjectStateEnum::STATE_LOADED) {
252
+			$this->status = TDBMObjectStateEnum::STATE_DIRTY;
253
+			$this->tdbmService->_addToToSaveObjectList($this);
254
+		}
255
+	}
256
+
257
+	/**
258
+	 * @param string             $foreignKeyName
259
+	 * @param AbstractTDBMObject $bean
260
+	 */
261
+	public function setRef($foreignKeyName, AbstractTDBMObject $bean = null)
262
+	{
263
+		$this->references[$foreignKeyName] = $bean;
264
+
265
+		if ($this->tdbmService !== null && $this->status === TDBMObjectStateEnum::STATE_LOADED) {
266
+			$this->status = TDBMObjectStateEnum::STATE_DIRTY;
267
+			$this->tdbmService->_addToToSaveObjectList($this);
268
+		}
269
+	}
270
+
271
+	/**
272
+	 * @param string $foreignKeyName A unique name for this reference
273
+	 *
274
+	 * @return AbstractTDBMObject|null
275
+	 */
276
+	public function getRef($foreignKeyName)
277
+	{
278
+		if (isset($this->references[$foreignKeyName])) {
279
+			return $this->references[$foreignKeyName];
280
+		} elseif ($this->status === TDBMObjectStateEnum::STATE_NEW) {
281
+			// If the object is new and has no property, then it has to be empty.
282
+			return;
283
+		} else {
284
+			$this->_dbLoadIfNotLoaded();
285
+
286
+			// Let's match the name of the columns to the primary key values
287
+			$fk = $this->tdbmService->_getForeignKeyByName($this->dbTableName, $foreignKeyName);
288
+
289
+			$values = [];
290
+			foreach ($fk->getLocalColumns() as $column) {
291
+				$values[] = $this->dbRow[$column];
292
+			}
293
+
294
+			$filter = array_combine($this->tdbmService->getPrimaryKeyColumns($fk->getForeignTableName()), $values);
295
+
296
+			return $this->tdbmService->findObjectByPk($fk->getForeignTableName(), $filter, [], true);
297
+		}
298
+	}
299
+
300
+	/**
301
+	 * Returns the name of the table this object comes from.
302
+	 *
303
+	 * @return string
304
+	 */
305
+	public function _getDbTableName()
306
+	{
307
+		return $this->dbTableName;
308
+	}
309
+
310
+	/**
311
+	 * Method used internally by TDBM. You should not use it directly.
312
+	 * This method returns the status of the TDBMObject.
313
+	 * This is one of TDBMObjectStateEnum::STATE_NEW, TDBMObjectStateEnum::STATE_NOT_LOADED, TDBMObjectStateEnum::STATE_LOADED, TDBMObjectStateEnum::STATE_DELETED.
314
+	 * $status = TDBMObjectStateEnum::STATE_NEW when a new object is created with DBMObject:getNewObject.
315
+	 * $status = TDBMObjectStateEnum::STATE_NOT_LOADED when the object has been retrieved with getObject but when no data has been accessed in it yet.
316
+	 * $status = TDBMObjectStateEnum::STATE_LOADED when the object is cached in memory.
317
+	 *
318
+	 * @return string
319
+	 */
320
+	public function _getStatus()
321
+	{
322
+		return $this->status;
323
+	}
324
+
325
+	/**
326
+	 * Override the native php clone function for TDBMObjects.
327
+	 */
328
+	public function __clone()
329
+	{
330
+		// Let's load the row (before we lose the ID!)
331
+		$this->_dbLoadIfNotLoaded();
332
+
333
+		//Let's set the status to detached
334
+		$this->status = TDBMObjectStateEnum::STATE_DETACHED;
335
+
336
+		$this->primaryKeys = [];
337
+
338
+		//Now unset the PK from the row
339
+		if ($this->tdbmService) {
340
+			$pk_array = $this->tdbmService->getPrimaryKeyColumns($this->dbTableName);
341
+			foreach ($pk_array as $pk) {
342
+				$this->dbRow[$pk] = null;
343
+			}
344
+		}
345
+	}
346
+
347
+	/**
348
+	 * Returns raw database row.
349
+	 *
350
+	 * @return array
351
+	 */
352
+	public function _getDbRow()
353
+	{
354
+		// Let's merge $dbRow and $references
355
+		$dbRow = $this->dbRow;
356
+
357
+		foreach ($this->references as $foreignKeyName => $reference) {
358
+			// Let's match the name of the columns to the primary key values
359
+			$fk = $this->tdbmService->_getForeignKeyByName($this->dbTableName, $foreignKeyName);
360
+			$refDbRows = $reference->_getDbRows();
361
+			$firstRefDbRow = reset($refDbRows);
362
+			$pkValues = array_values($firstRefDbRow->_getPrimaryKeys());
363
+			$localColumns = $fk->getLocalColumns();
364
+
365
+			for ($i = 0, $count = count($localColumns); $i < $count; ++$i) {
366
+				$dbRow[$localColumns[$i]] = $pkValues[$i];
367
+			}
368
+		}
369
+
370
+		return $dbRow;
371
+	}
372
+
373
+	/**
374
+	 * Returns references array.
375
+	 *
376
+	 * @return AbstractTDBMObject[]
377
+	 */
378
+	public function _getReferences()
379
+	{
380
+		return $this->references;
381
+	}
382
+
383
+	/**
384
+	 * Returns the values of the primary key.
385
+	 * This is set when the object is in "loaded" state.
386
+	 *
387
+	 * @return array
388
+	 */
389
+	public function _getPrimaryKeys()
390
+	{
391
+		return $this->primaryKeys;
392
+	}
393
+
394
+	/**
395
+	 * Sets the values of the primary key.
396
+	 * This is set when the object is in "loaded" state.
397
+	 *
398
+	 * @param array $primaryKeys
399
+	 */
400
+	public function _setPrimaryKeys(array $primaryKeys)
401
+	{
402
+		$this->primaryKeys = $primaryKeys;
403
+		foreach ($this->primaryKeys as $column => $value) {
404
+			$this->dbRow[$column] = $value;
405
+		}
406
+	}
407
+
408
+	/**
409
+	 * Returns the TDBMObject this bean is associated to.
410
+	 *
411
+	 * @return AbstractTDBMObject
412
+	 */
413
+	public function getTDBMObject()
414
+	{
415
+		return $this->object;
416
+	}
417
+
418
+	/**
419
+	 * Sets the TDBMObject this bean is associated to.
420
+	 * Only used when cloning.
421
+	 *
422
+	 * @param AbstractTDBMObject $object
423
+	 */
424
+	public function setTDBMObject(AbstractTDBMObject $object)
425
+	{
426
+		$this->object = $object;
427
+	}
428 428
 }
Please login to merge, or discard this patch.