Completed
Push — master ( 14137d...5533aa )
by Maxime
46:47
created

BaseModel::getAllColumnsNames()   C

Complexity

Conditions 7
Paths 17

Size

Total Lines 48
Code Lines 34

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 26.0383

Importance

Changes 3
Bugs 0 Features 2
Metric Value
c 3
b 0
f 2
dl 0
loc 48
ccs 10
cts 37
cp 0.2703
rs 6.7272
cc 7
eloc 34
nc 17
nop 0
crap 26.0383
1
<?php namespace Distilleries\Expendable\Models;
2
3
use Illuminate\Database\Eloquent\Model;
4
use \DB;
5
use \Exception;
6
use Illuminate\Support\Str;
7
8
class BaseModel extends Model
9
{
10
11
    protected $reserves = [
12
        'ACCESS',
13
        'ACCOUNT',
14
        'ACTIVATE',
15
        'ADD',
16
        'ADMIN',
17
        'ADVISE',
18
        'AFTER',
19
        'ALL',
20
        'ALL_ROWS',
21
        'ALLOCATE',
22
        'ALTER',
23
        'ANALYZE',
24
        'AND',
25
        'ANY',
26
        'ARCHIVE',
27
        'ARCHIVELOG',
28
        'ARRAY',
29
        'AS',
30
        'ASC',
31
        'AT',
32
        'AUDIT',
33
        'AUTHENTICATED',
34
        'AUTHORIZATION',
35
        'AUTOEXTEND',
36
        'AUTOMATIC',
37
        'BACKUP',
38
        'BECOME',
39
        'BEFORE',
40
        'BEGIN',
41
        'BETWEEN',
42
        'BFILE',
43
        'BITMAP',
44
        'BLOB',
45
        'BLOCK',
46
        'BODY',
47
        'BY',
48
        'CACHE',
49
        'CACHE_INSTANCES',
50
        'CANCEL',
51
        'CASCADE',
52
        'CAST',
53
        'CFILE',
54
        'CHAINED',
55
        'CHANGE',
56
        'CHAR',
57
        'CHAR_CS',
58
        'CHARACTER',
59
        'CHECK',
60
        'CHECKPOINT',
61
        'CHOOSE',
62
        'CHUNK',
63
        'CLEAR',
64
        'CLOB',
65
        'CLONE',
66
        'CLOSE',
67
        'CLOSE_CACHED_OPEN_CURSORS',
68
        'CLUSTER',
69
        'COALESCE',
70
        'COLUMN',
71
        'COLUMNS',
72
        'COMMENT',
73
        'COMMIT',
74
        'COMMITTED',
75
        'COMPATIBILITY',
76
        'COMPILE',
77
        'COMPLETE',
78
        'COMPOSITE_LIMIT',
79
        'COMPRESS',
80
        'COMPUTE',
81
        'CONNECT',
82
        'CONNECT_TIME',
83
        'CONSTRAINT',
84
        'CONSTRAINTS',
85
        'CONTENTS',
86
        'CONTINUE',
87
        'CONTROLFILE',
88
        'CONVERT',
89
        'COST',
90
        'CPU_PER_CALL',
91
        'CPU_PER_SESSION',
92
        'CREATE',
93
        'CURRENT',
94
        'CURRENT_SCHEMA',
95
        'CURREN_USER',
96
        'CURSOR',
97
        'CYCLE',
98
        'DANGLING',
99
        'DATABASE',
100
        'DATAFILE',
101
        'DATAFILES',
102
        'DATAOBJNO',
103
        'DATE',
104
        'DBA',
105
        'DBHIGH',
106
        'DBLOW',
107
        'DBMAC',
108
        'DEALLOCATE',
109
        'DEBUG',
110
        'DEC',
111
        'DECIMAL',
112
        'DECLARE',
113
        'DEFAULT',
114
        'DEFERRABLE',
115
        'DEFERRED',
116
        'DEGREE',
117
        'DELETE',
118
        'DEREF',
119
        'DESC',
120
        'DIRECTORY',
121
        'DISABLE',
122
        'DISCONNECT',
123
        'DISMOUNT',
124
        'DISTINCT',
125
        'DISTRIBUTED',
126
        'DML',
127
        'DOUBLE',
128
        'DROP',
129
        'DUMP',
130
        'EACH',
131
        'ELSE',
132
        'ENABLE',
133
        'END',
134
        'ENFORCE',
135
        'ENTRY',
136
        'ESCAPE',
137
        'EXCEPT',
138
        'EXCEPTIONS',
139
        'EXCHANGE',
140
        'EXCLUDING',
141
        'EXCLUSIVE',
142
        'EXECUTE',
143
        'EXISTS',
144
        'EXPIRE',
145
        'EXPLAIN',
146
        'EXTENT',
147
        'EXTENTS',
148
        'EXTERNALLY',
149
        'FAILED_LOGIN_ATTEMPTS',
150
        'FALSE',
151
        'FAST',
152
        'FILE',
153
        'FIRST_ROWS',
154
        'FLAGGER',
155
        'FLOAT',
156
        'FLOB',
157
        'FLUSH',
158
        'FOR',
159
        'FORCE',
160
        'FOREIGN',
161
        'FREELIST',
162
        'FREELISTS',
163
        'FROM',
164
        'FULL',
165
        'FUNCTION',
166
        'GLOBAL',
167
        'GLOBALLY',
168
        'GLOBAL_NAME',
169
        'GRANT',
170
        'GROUP',
171
        'GROUPS',
172
        'HASH',
173
        'HASHKEYS',
174
        'HAVING',
175
        'HEADER',
176
        'HEAP',
177
        'IDENTIFIED',
178
        'IDGENERATORS',
179
        'IDLE_TIME',
180
        'IF',
181
        'IMMEDIATE',
182
        'IN',
183
        'INCLUDING',
184
        'INCREMENT',
185
        'INDEX',
186
        'INDEXED',
187
        'INDEXES',
188
        'INDICATOR',
189
        'IND_PARTITION',
190
        'INITIAL',
191
        'INITIALLY',
192
        'INITRANS',
193
        'INSERT',
194
        'INSTANCE',
195
        'INSTANCES',
196
        'INSTEAD',
197
        'INT',
198
        'INTEGER',
199
        'INTERMEDIATE',
200
        'INTERSECT',
201
        'INTO',
202
        'IS',
203
        'ISOLATION',
204
        'ISOLATION_LEVEL',
205
        'KEEP',
206
        'KEY',
207
        'KILL',
208
        'LABEL',
209
        'LAYER',
210
        'LESS',
211
        'LEVEL',
212
        'LIBRARY',
213
        'LIKE',
214
        'LIMIT',
215
        'LINK',
216
        'LIST',
217
        'LOB',
218
        'LOCAL',
219
        'LOCK',
220
        'LOCKED',
221
        'LOG',
222
        'LOGFILE',
223
        'LOGGING',
224
        'LOGICAL_READS_PER_CALL',
225
        'LOGICAL_READS_PER_SESSION',
226
        'LONG',
227
        'MANAGE',
228
        'MASTER',
229
        'MAX',
230
        'MAXARCHLOGS',
231
        'MAXDATAFILES',
232
        'MAXEXTENTS',
233
        'MAXINSTANCES',
234
        'MAXLOGFILES',
235
        'MAXLOGHISTORY',
236
        'MAXLOGMEMBERS',
237
        'MAXSIZE',
238
        'MAXTRANS',
239
        'MAXVALUE',
240
        'MIN',
241
        'MEMBER',
242
        'MINIMUM',
243
        'MINEXTENTS',
244
        'MINUS',
245
        'MINVALUE',
246
        'MLSLABEL',
247
        'MLS_LABEL_FORMAT',
248
        'MODE',
249
        'MODIFY',
250
        'MOUNT',
251
        'MOVE',
252
        'MTS_DISPATCHERS',
253
        'MULTISET',
254
        'NATIONAL',
255
        'NCHAR',
256
        'NCHAR_CS',
257
        'NCLOB',
258
        'NEEDED',
259
        'NESTED',
260
        'NETWORK',
261
        'NEW',
262
        'NEXT',
263
        'NOARCHIVELOG',
264
        'NOAUDIT',
265
        'NOCACHE',
266
        'NOCOMPRESS',
267
        'NOCYCLE',
268
        'NOFORCE',
269
        'NOLOGGING',
270
        'NOMAXVALUE',
271
        'NOMINVALUE',
272
        'NONE',
273
        'NOORDER',
274
        'NOOVERRIDE',
275
        'NOPARALLEL',
276
        'NOPARALLEL',
277
        'NOREVERSE',
278
        'NORMAL',
279
        'NOSORT',
280
        'NOT',
281
        'NOTHING',
282
        'NOWAIT',
283
        'NULL',
284
        'NUMBER',
285
        'NUMERIC',
286
        'NVARCHAR2',
287
        'OBJECT',
288
        'OBJNO',
289
        'OBJNO_REUSE',
290
        'OF',
291
        'OFF',
292
        'OFFLINE',
293
        'OID',
294
        'OIDINDEX',
295
        'OLD',
296
        'ON',
297
        'ONLINE',
298
        'ONLY',
299
        'OPCODE',
300
        'OPEN',
301
        'OPTIMAL',
302
        'OPTIMIZER_GOAL',
303
        'OPTION',
304
        'OR',
305
        'ORDER',
306
        'ORGANIZATION',
307
        'OSLABEL',
308
        'OVERFLOW',
309
        'OWN',
310
        'PACKAGE',
311
        'PARALLEL',
312
        'PARTITION',
313
        'PASSWORD',
314
        'PASSWORD_GRACE_TIME',
315
        'PASSWORD_LIFE_TIME',
316
        'PASSWORD_LOCK_TIME',
317
        'PASSWORD_REUSE_MAX',
318
        'PASSWORD_REUSE_TIME',
319
        'PASSWORD_VERIFY_FUNCTION',
320
        'PCTFREE',
321
        'PCTINCREASE',
322
        'PCTTHRESHOLD',
323
        'PCTUSED',
324
        'PCTVERSION',
325
        'PERCENT',
326
        'PERMANENT',
327
        'PLAN',
328
        'PLSQL_DEBUG',
329
        'POST_TRANSACTION',
330
        'PRECISION',
331
        'PRESERVE',
332
        'PRIMARY',
333
        'PRIOR',
334
        'PRIVATE',
335
        'PRIVATE_SGA',
336
        'PRIVILEGE',
337
        'PRIVILEGES',
338
        'PROCEDURE',
339
        'PROFILE',
340
        'PUBLIC',
341
        'PURGE',
342
        'QUEUE',
343
        'QUOTA',
344
        'RANGE',
345
        'RAW',
346
        'RBA',
347
        'READ',
348
        'READUP',
349
        'REAL',
350
        'REBUILD',
351
        'RECOVER',
352
        'RECOVERABLE',
353
        'RECOVERY',
354
        'REF',
355
        'REFERENCES',
356
        'REFERENCING',
357
        'REFRESH',
358
        'RENAME',
359
        'REPLACE',
360
        'RESET',
361
        'RESETLOGS',
362
        'RESIZE',
363
        'RESOURCE',
364
        'RESTRICTED',
365
        'RETURN',
366
        'RETURNING',
367
        'REUSE',
368
        'REVERSE',
369
        'REVOKE',
370
        'ROLE',
371
        // 'ROLES',
372
        'ROLLBACK',
373
        'ROW',
374
        'ROWID',
375
        'ROWNUM',
376
        'ROWS',
377
        'RULE',
378
        'SAMPLE',
379
        'SAVEPOINT',
380
        'SB4',
381
        'SCAN_INSTANCES',
382
        'SCHEMA',
383
        'SCN',
384
        'SCOPE',
385
        'SD_ALL',
386
        'SD_INHIBIT',
387
        'SD_SHOW',
388
        'SEGMENT',
389
        'SEG_BLOCK',
390
        'SEG_FILE',
391
        'SELECT',
392
        'SEQUENCE',
393
        'SERIALIZABLE',
394
        'SESSION',
395
        'SESSION_CACHED_CURSORS',
396
        'SESSIONS_PER_USER',
397
        'SET',
398
        'SHARE',
399
        'SHARED',
400
        'SHARED_POOL',
401
        'SHRINK',
402
        'SIZE',
403
        'SKIP',
404
        'SKIP_UNUSABLE_INDEXES',
405
        'SMALLINT',
406
        'SNAPSHOT',
407
        'SOME',
408
        'SORT',
409
        'SPECIFICATION',
410
        'SPLIT',
411
        'SQL_TRACE',
412
        'STANDBY',
413
        'START',
414
        'STATEMENT_ID',
415
        'STATISTICS',
416
        'STOP',
417
        'STORAGE',
418
        'STORE',
419
        'STRUCTURE',
420
        'SUCCESSFUL',
421
        'SWITCH',
422
        'SYS_OP_ENFORCE_NOT_NULL$',
423
        'SYS_OP_NTCIMG$',
424
        'SYNONYM',
425
        'SYSDATE',
426
        'SYSDBA',
427
        'SYSOPER',
428
        // 'SYSTEM',
429
        'TABLE',
430
        'TABLES',
431
        'TABLESPACE',
432
        'TABLESPACE_NO',
433
        'TABNO',
434
        'TEMPORARY',
435
        'THAN',
436
        'THE',
437
        'THEN',
438
        'THREAD',
439
        'TIMESTAMP',
440
        'TIME',
441
        'TO',
442
        'TOPLEVEL',
443
        'TRACE',
444
        'TRACING',
445
        'TRANSACTION',
446
        'TRANSITIONAL',
447
        'TRIGGER',
448
        'TRIGGERS',
449
        'TRUE',
450
        'TRUNCATE',
451
        'TX',
452
        // 'TYPE',
453
        'UB2',
454
        'UBA',
455
        'UID',
456
        'UNARCHIVED',
457
        'UNDO',
458
        'UNION',
459
        'UNIQUE',
460
        'UNLIMITED',
461
        'UNLOCK',
462
        'UNRECOVERABLE',
463
        'UNTIL',
464
        'UNUSABLE',
465
        'UNUSED',
466
        'UPDATABLE',
467
        'UPDATE',
468
        'USAGE',
469
        'USE',
470
        'USER',
471
        'USING',
472
        'VALIDATE',
473
        'VALIDATION',
474
        'VALUE',
475
        'VALUES',
476
        'VARCHAR',
477
        'VARCHAR2',
478
        'VARYING',
479
        'VIEW',
480
        'WHEN',
481
        'WHENEVER',
482
        'WHERE',
483
        'WITH',
484
        'WITHOUT',
485
        'WORK',
486
        'WRITE',
487
        'WRITEDOWN',
488
        'WRITEUP',
489
        'XID',
490
        'YEAR',
491
        'ZONE',
492
    ];
493
494
    /**
495
     * Check if value is an Oracle reserved word.
496
     *
497
     * @param string $value
498
     * @return bool
499
     */
500
    public function isReserved($value)
501
    {
502
        return DB::connection()->getDriverName() == 'oracle' && in_array(Str::upper(trim($value)), $this->reserves, true);
503
    }
504
505
506 28
    public static function getChoice()
507
    {
508
509 28
        $data   = self::all();
510 28
        $result = [];
511 28
        foreach ($data as $item)
512
        {
513 28
            $result[$item['id']] = isset($item['libelle']) ? $item['libelle'] : $item['id'];
514 28
        }
515
516 28
        return $result;
517
    }
518
519
    public function scopeSearch($query, $searchQuery)
520
    {
521
522 12
        return $query->where(function ($query) use ($searchQuery)
523
        {
524 12
            $columns = $this->getAllColumnsNames();
525
526
            foreach ($columns as $column)
527
            {
528
                $column = $this->isReserved($column)?'"'.$column.'"':$column;
529
                $query->orWhereRaw('LOWER(' . $column . ') like ?', ['%' . strtolower($searchQuery) . '%']);
530
            }
531 12
        });
532
    }
533
534 16
    public function getAllColumnsNames()
535
    {
536 16
        switch (DB::connection()->getDriverName())
537
        {
538 16
            case 'pgsql':
539
                $query       = "SELECT column_name FROM information_schema.columns WHERE table_name = '" . $this->getTable() . "'";
540
                $column_name = 'column_name';
541
                $reverse     = true;
542
                break;
543
544 16
            case 'mysql':
545
                $query       = 'SHOW COLUMNS FROM ' . $this->getTable();
546
                $column_name = 'Field';
547
                $reverse     = false;
548
                break;
549
550 16
            case 'sqlsrv':
551
                $parts       = explode('.', $this->getTable());
552
                $num         = (count($parts) - 1);
553
                $table       = $parts[$num];
554
                $query       = "SELECT column_name FROM " . DB::connection()->getConfig('database') . ".INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'" . $table . "'";
555
                $column_name = 'column_name';
556
                $reverse     = false;
557
                break;
558 16
            case 'oracle':
559
                $query       = 'SELECT COLUMN_NAME from ALL_TAB_COLUMNS WHERE TABLE_NAME=\'' . strtoupper($this->getTable()) . '\' AND DATA_TYPE <> \'CLOB\' AND DATA_TYPE <> \'NUMBER\' AND DATA_TYPE <> \'TIMESTAMP\'';
560
                $column_name = 'column_name';
561
                $reverse     = false;
562
                break;
563 16
            default:
564 16
                $error = 'Database driver not supported: ' . DB::connection()->getConfig('driver');
565 16
                throw new Exception($error);
566 16
        }
567
568
        $columns = array();
569
570
        foreach (DB::select($query) as $column)
571
        {
572
            $columns[] = $column->$column_name;
573
        }
574
575
        if ($reverse)
576
        {
577
            $columns = array_reverse($columns);
578
        }
579
580
        return $columns;
581
    }
582
583 16
    public function scopeBetweenCreate($query, $start, $end)
584
    {
585 16
        return $query->whereBetween($this->getTable() . '.created_at', array($start, $end));
586
    }
587
588 8
    public function scopeBetweenUpdate($query, $start, $end)
589
    {
590 8
        return $query->whereBetween($this->getTable() . '.updated_at', array($start, $end));
591
    }
592
593
594
595
}