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

BaseModel   A

Complexity

Total Complexity 17

Size/Duplication

Total Lines 588
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 42.11%

Importance

Changes 7
Bugs 1 Features 3
Metric Value
wmc 17
c 7
b 1
f 3
lcom 1
cbo 2
dl 0
loc 588
ccs 24
cts 57
cp 0.4211
rs 10

6 Methods

Rating   Name   Duplication   Size   Complexity  
A isReserved() 0 4 2
A getChoice() 0 12 3
A scopeSearch() 0 14 3
C getAllColumnsNames() 0 48 7
A scopeBetweenCreate() 0 4 1
A scopeBetweenUpdate() 0 4 1
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
}