Kondisi Where
Pada beberapa method model memiliki parameter $where
yang adalah array.
Di bawah ini adalah penjelasan tentang bagaimana penulisan kondisi where
yang benar.
Jika nilai suatu kondisi adalah array, maka system akan memproses data tersebut
yang mungkin dianggap spesial seperti di bawah. Untuk melewati proses inspeksi
nilai array, tambahkan nilai __!
pada bagian paling belakang array. Nilai
__!
tersebut akan dibuang, dan nilai awal array digunakan pada query IN
tanpa memproses nilai-nilai lainnya.
Standar
Kondisi paling umum adalah kondisi field->value pair yang artinya where
field adalah value. Masing-masing field digabungkan dengan operator =
dan penghubung AND
.
$where = [
'id' => 1,
'name' => 'mim'
];
// `id` = 1 AND `name` = 'mim'
IN Query
Untuk mencari baris dimana nilai yang dicari lebih dari satu, bisa menggunakan array:
$where = [
'id' => [1,2,3],
'name' => ['mim','php','framework'],
'status' => 1
];
// `id` IN (1,2,3)
// AND `name` IN ('mim','php','framework')
// AND `status` = 1
Operator
Nilai field bisa juga menerima array yang adalah pendanda operator seperti di bawah:
$where = [
'id' => ['__op', '>', 12],
'status' => 1,
'user' => ['__op', '!=', null],
'deleted' => ['__op', '=', null],
'slug' => ['__op', 'NOT IN', ['one','two']]
];
// `id` > 12 AND
// `status` = 1 AND
// `user` IS NOT NULL AND
// `deleted` IS NULL AND
// `slug` NOT IN ('one','two')
Operator yang dikenal adalah >
, <
, <=
, >=
, =
, !=
, dan NOT IN
.
Between
Untuk mendapatkan row dengan nilai field diantara dua nilai, gunakan operator
array __between
:
$where = [
'id' => ['__between', 1, 5],
'status' => 1
];
// ( `id` BETWEEN 1 AND 2 ) AND `status` = 1
Like
Penggunaan like juga menggunakan bentuk array operator dengan operator array __like
:
$where = [
'name' => ['__like', 'mim', 'left']
];
// `name` LIKE '%mim'
$where = [
'name' => ['__like', 'mim', 'right']
];
// `name` LIKE 'mim%'
$where = [
'name' => ['__like', 'mim']
];
// `name` LIKE '%mim%'
$where = [
'name' => ['__like', 'mim', 'none']
];
// `name` LIKE 'mim'
$where = [
'name' => ['__like', 'mim', 'both']
];
// `name` LIKE '%mim%'
$where = [
'name' => ['__like', 'mim', null, 'NOT']
];
// `name` NOT LIKE 'mim'
Nilai field juga bisa menerima array value:
$where = [
'name' => ['__like', ['mim', 'php', 'framework']]
];
// ( `name` LIKE '%mim%' OR `name` LIKE '%php%' OR `name` LIKE '%framework%' )
AND
Untuk menghubungkan beberapa kondisi where dengan penghubung AND
, gunakan
nama field $and
:
$where = [
'status' => 1,
'$and' => [
[
'created' => ['__op', '!=', NULL]
],
[
'created' => ['__op', '>', '2018-09-30']
]
]
];
// `status` = 1
// AND (
// ( `created` IS NOT NULL )
// AND
// ( `created` > '2018-09-30' )
// )
OR
Untuk menghubungkan beberapa kondisi where dengan penghubung OR
, gunakan
nama field $or
:
$where = [
'status' => 1,
'$or' => [
[
'name' => 'mim'
],
[
'name' => 'php'
]
]
];
// `status` = 1
// AND (
// ( `name` = 'mim' )
// OR
// ( `name` = 'php' )
// )
Unescape
Jika membutuhkan field name yang sudah di-escape atau tidak ingin di-escape, bisa menggunakan prefix ‘?’ pada field name:
$where = [
'?`user`' => 1,
'?JSON_EXTRACT(`price`, \'$.anually\')' => ['__op', '!=', '']
];
// `user` = 1
// AND (
// JSON_EXTRACT(`price`, '$.anually') != ''
// )
Sebagai catatan, penggunaan unescape pada field tidak akan memparse tabel dan nama database sehingga nilai dari tabel dan database mungkin perlu ditambahkan pada nilai field.
Dari Tabel Lain
Memungkinkan juga mengambil data where dari tabel lain jika informasi chain disimpan di properti model:
class User extends \Mim\Model{
protected static $table = 't_user';
// ...
}
class Post extends \Mim\Model{
protected static $tabel = 't_post';
protected static $chains = [
'user' => [
'model' => 'User',
'field' => 'id',
'self' => 'creator'
]
];
}
$where = [
'status' => 1,
'user.name' => 'mim'
];
// `t_post`.`status` = 1 AND `t_user`.`name` = 'mim'
Keterangan masing-masing properti adalah sebagai berikut:
user
Nama kolom yang akan dibandingkan dengan tabel lain.user.model
Nama model untuk mendapatkan data dari tabel chainuser.field
Nama kolom di tabel chain yang akan digunakan sebagai penghubung.user.self
Optional. Nama kolom di tabel model ini yang akan dibandingkan sebagai penghubung. Jika tidak di set, maka nama kolom properti akan digunakan, pada contoh di atas akan menggunakan kolomuser
jika propertiuser.self
tidak diset.
Dengan contoh di atas, maka bentuk join yang akan terbuat adalah:
FROM t_post LEFT JOIN t_user ON t_post.creator = t_user.id;