Completed
Push — master ( feaa83...e771ae )
by Maxime
19:00
created

BaseModel::getChoice()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 11
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 3

Importance

Changes 3
Bugs 1 Features 0
Metric Value
c 3
b 1
f 0
dl 0
loc 11
ccs 7
cts 7
cp 1
rs 9.4285
cc 3
eloc 6
nc 3
nop 0
crap 3
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,
503
            true);
504
    }
505
506
507 28
    public static function getChoice()
508
    {
509
510 28
        $data   = self::all();
511 28
        $result = [];
512 28
        foreach ($data as $item) {
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 12
            $columns = $this->getAllColumnsNames();
524
525
            foreach ($columns as $column) {
526
                $column = $this->isReserved($column) ? '"' . $column . '"' : $column;
527
528
                if ((DB::connection()->getDriverName()) == 'oracle') {
529
                    $query->orWhereRaw('LOWER(' . $column . ') like ?', ['%' . strtolower($searchQuery) . '%']);
530
                } else {
531
                    $query->orwhere($column, 'like', '%' . $searchQuery . '%');
532
                }
533
534
            }
535 12
        });
536
    }
537
538 16
    public function getAllColumnsNames()
539
    {
540 16
        switch (DB::connection()->getDriverName()) {
541 16
            case 'pgsql':
542
                $query       = "SELECT column_name FROM information_schema.columns WHERE table_name = '" . $this->getTable() . "'";
543
                $column_name = 'column_name';
544
                $reverse     = true;
545
                break;
546
547 16
            case 'mysql':
548
                $query       = 'SHOW COLUMNS FROM ' . $this->getTable();
549
                $column_name = 'Field';
550
                $reverse     = false;
551
                break;
552
553 16
            case 'sqlsrv':
554
                $parts       = explode('.', $this->getTable());
555
                $num         = (count($parts) - 1);
556
                $table       = $parts[$num];
557
                $query       = "SELECT column_name FROM " . DB::connection()->getConfig('database') . ".INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'" . $table . "'";
558
                $column_name = 'column_name';
559
                $reverse     = false;
560
                break;
561 16
            case 'oracle':
562
                $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\'';
563
                $column_name = 'column_name';
564
                $reverse     = false;
565
                break;
566 16
            default:
567 16
                $error = 'Database driver not supported: ' . DB::connection()->getConfig('driver');
568 16
                throw new Exception($error);
569 16
        }
570
571
        $columns = [];
572
573
        foreach (DB::select($query) as $column) {
574
            $columns[] = $column->$column_name;
575
        }
576
577
        if ($reverse) {
578
            $columns = array_reverse($columns);
579
        }
580
581
        return $columns;
582
    }
583
584 16
    public function scopeBetweenCreate($query, $start, $end)
585
    {
586 16
        return $query->whereBetween($this->getTable() . '.created_at', [$start, $end]);
587
    }
588
589 8
    public function scopeBetweenUpdate($query, $start, $end)
590
    {
591 8
        return $query->whereBetween($this->getTable() . '.updated_at', [$start, $end]);
592
    }
593
594
595
}