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

BaseModel::isReserved()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 4
ccs 0
cts 2
cp 0
rs 10
cc 2
eloc 2
nc 2
nop 1
crap 6
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
}