GnfDB
, (*1)
์ฌ๊ธฐ๋ ridi
๋ชจ๋
ธ๋ ํฌ์ Git Subrepo
๋ฅผ ํตํด์ ์ฝ๋๊ฐ ๊ด๋ฆฌ๋ฉ๋๋ค., (*2)
Warning
์ง์ commitํ์ง ๋ง์ธ์., (*3)
0. ์ค์น
composer๋ฅผ ์ฌ์ฉํ์ฌ ์ค์น ํ ์ ์๋ค., (*4)
ridibooks/platform-gnfdb ๋๋ gnf/gnfdb๋ฅผ ์ค์นํ๋ฉด ๋๋ค., (*5)
composer require ridibooks/platform-gnfdb
1. ์ฐ๊ฒฐ ๋ฐฉ๋ฒ
gnfdb ํจํค์ง ๋ด์ Gnf\db\PDO ๋ฅผ instanceํ ํ๋ฉด ์ฌ์ฉ ํ ์ ์๋ค., (*6)
Gnf\db\PDO๋ \PDO๋ฅผ ์ธ์๋ก ๋ฐ๋๋ค. ์ฐ๊ฒฐ์ ์์ฑํ๊ณ ์ธ์๋ก ์ ๋ฌํ์., (*7)
<?php
$pdo_dbh = new PDO('mysql:host={host}', $user, $password);
$db = new Gnf\db\PDO($pdo_dbh);
2. SELECT ๊ด๋ จ
select์ ์ฌ์ฉํ๋ method ๋ชฉ๋ก์ ๋ค์๊ณผ ๊ฐ๋ค., (*8)
- sqlDict / sqlDicts - ๊ฒฐ๊ณผ ๊ฐ์ array(PDO::FETCH_ASSOC)๋ก ๋ฐ๋๋ค.
- sqlObject / sqlObjects - ๊ฒฐ๊ณผ ๊ฐ์ object(PDO::FETCH_OBJ)๋ก ๋ฐ๋๋ค.
์ method์ ํํ๋ ๋ค์๊ณผ ๊ฐ๋ค., (*9)
\PDO์ prepare์ ๋ฌธ๋ฒ์ด ๋์ผํ์ง๋ง, ":column:" ๊ณผ ๊ฐ์ bind๋ ์ง์ํ์ง ์๊ณ , "?" ๋ก ์ฌ์ฉํ๋ bind๋ง ์ง์ํ๋ค., (*10)
ํ๋๋ง ๊ฐ์ ธ์ค๋ sqlDict / sqlObject๋ ๋ฐ์ดํฐ๊ฐ ์์ ๊ฒฝ์ฐ null์ returnํ๊ณ ,
์ฌ๋ฌ๊ฐ๋ฅผ ๊ฐ์ ธ์ค๋ sqlDicts / sqlObjects๋ ๋ฐ์ดํฐ๊ฐ ์์ ๊ฒฝ์ฐ empty array๋ฅผ returnํ๋ค.ย , (*11)
์ฌ์ฉ ์์ , (*12)
$db->sqlDict('SELECT * FROM tb_book WHERE id = ?', $b_id);
$db->sqlDicts(
'SELECT *
FROM tb_book
INNER JOIN cpdp_books ON (tb_book.id = cpdp_books.b_id AND cpdp_books.approve_status = ?)
WHERE tb_book.id = ? AND tb_book.pub_id = ?',
ApproveStatus::OPEN,
$b_id,
$pud_ib
);
3. WHERE ์กฐ๊ฑด์ ํ์ฅ๋ ์ฌ์ฉ๋ฒ
where ์กฐ๊ฑด์ ์ง์ ์ ์ผ๋ก ์ง์ ํ๊ณ ?๋ฅผ bind ํ ์ ์์ง๋ง, ๋ถํธํ๊ธฐ์ ๋ค์๊ณผ ๊ฐ์ ํจ์๋ฅผ ์ง์ํ๋ค., (*13)
$where์ column => condition ์ผ๋ก ๊ตฌ์ฑ๋ ๋ฐฐ์ด์ด๋ค., (*14)
3.1 ์กฐ๊ฑด ์์ฑ ๋ฒ
- ๋จ์ ๋น๊ต๋ ๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค.
- ๋น๊ต ์ฐ์ฐ์๋ ๋ค์ ํจ์๋ฅผ ๊ฐ์ผ๋ก ์ฌ์ฉํ๋ค.
sqlLesser($value)
< $value
sqlLesserEqual($value)
<= $value
sqlGreater($value)
> $value
sqlGreaterEqual($value)
>= $value
- ๋ฒ์ ์ฐ์ฐ์
sqlBetween($start, $end)
$start <= value <= $end
sqlRange($start, $end)
$start <= b < $end
- like ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋ค.
sqlLike($keyword)
like '%{$keyword}%'
sqlLikeBegin($keyword)
like '{$keyword}%'
์กฐ๊ฑด ์์ฑ ์์ , (*15)
<?php
//๋จ์ ๋น๊ต
$db->sqlDict(
'SELECT * FROM tb_book WHERE ?',
sqlWhere(['id' => $b_id])
); // => SELECT * FROM tb_book WHERE id = {$b_id}
//๋น๊ต ์ฐ์ฐ์
$db->sqlDict(
'SELECT * FROM tb_book WHERE ?',
sqlWhere(['pub_id' => sqlLesser($pub_id)])
); // => SELECT * FROM tb_book WHERE pub_id < {$pub_id}
//Between
$db->sqlDict(
'SELECT * FROM tb_book WHERE ?',
sqlWhere(['regdate' => sqlBetween('20160101000000', '20161231235959')])
); // => SELECT * FROM tb_book WHERE regdate BETWEEN '20160101000000' AND '20161231235959'
//like
$db->sqlDict(
'SELECT * FROM tb_book WHERE ?',
sqlWhere(['title' => sqlLike('์ฒดํํ')])
); // => SELECT * FROM tb_book WHERE title like '%์ฒดํํ%'
- ๋จ์ ๋น๊ต ์ ๋น๊ต ๋์์ด array์ธ ๊ฒฝ์ฐ IN ์ฟผ๋ฆฌ๋ก ์ ์ฉ๋๋ค.
๋น๊ต ๋์์ด array์ธ ์ฟผ๋ฆฌ ์์ , (*16)
<?php
$b_ids = ['101000940', '101000941', '101000945'];
$db->sqlDicts(
'SELECT * FROM tb_book WHERE ?',
sqlWhere(['id' => $b_ids])
); // => SELECT * FROM tb_book WHERE id IN ('101000940', '101000941', '101000945')
3.2 ๊ฐ์ด ์ฌ์ฉ ํ ์ ์๋ ํจ์
- sqlRaw($value)
- ์
๋ ฅ ํ ๊ฐ ๊ทธ๋๋ก ์ฌ์ฉ๋๋ค.
- sqlLimit($count)
- sqlLimit($from, $count)
- sqlNull()
- null ๊ฐ, ๊ทธ๋ฅ ๊ฐ์ผ๋ก null์ ์ฌ์ฉํด๋ ๋์ผํ๋ค.
- sqlNot($value)
- Not์ด ์ ์ฉ ๋๋ค. sqlGreater ๋ฑ ๋ค๋ฅธ ์ฐ์ฐ๊ณผ ๋ณตํฉ์ ์ผ๋ก ์ฌ์ฉ ํ ์ ์๋ค.
3.3 AND, OR ๋ณตํฉ ์ฌ์ฉ
์์ ์ค๋ช
ํ๋ sqlWhere์ AND๋ก ์์ฑํ๋ ํจ์๊ณ , sqlOr($where) ํจ์๋ก OR๋ฌธ์ ์์ฑ ํ ์ ์๋ค., (*17)
์ด ๋ ํจ์๋ฅผ ์์ด ์ฌ์ฉํจ์ผ๋ก ๋ค์ํ where๋ฌธ ์์ฑ์ด ๊ฐ๋ฅํ๋ค., (*18)
๋ณตํฉ ์ฟผ๋ฆฌ, (*19)
<?php
$where = [
'tb_book.pub_id' => sqlNot(101),
sqlOr(
[
'tb_book.category' => sqlNot(
[
4001,
4003
]
)
],
[
'tb_book.serial_completed' => sqlNot('Y'),
'tb_book.series_id' => sqlNot('')
],
['tb_category.genre' => sqlNot('comic')],
['tb_book.is_setbook' => 'Y']
)
];
$db->sqlDicts(
'SELECT tb_book.id
FROM tb_book
LEFT JOIN tb_book_comic ON (tb_book.id = tb_book_comic.b_id)
LEFT JOIN tb_category ON (tb_book.category = tb_category.id)
WHERE ?',
sqlWhere($where)
);
/*
SELECT tb_book.id
FROM tb_book
LEFT JOIN tb_book_comic ON (tb_book.id = tb_book_comic.b_id)
LEFT JOIN tb_category ON (tb_book.category = tb_category.id)
WHERE tb_book.pub_id != 101
AND (
tb_book.category NOT IN (4001, 4003)
OR (
tb_book.serial_completed != 'Y'
AND tb_book.series_id != ''
)
OR tb_category.genre != 'comic'
OR tb_book.is_setbook = 'Y'
)
*/
3.4 ํ์ฅ๋ ํ
์ด๋ธ ๊ตฌ๋ฌธ
ํ
์ด๋ธ๋ช
์ ์ง์ ์ ์ผ๋ก ์ฟผ๋ฆฌ์ ์์ฑ ํ ์ ์์ง๋ง, JOIN์ ON ์กฐ๊ฑด์ผ๋ก ์ฐ๊ฒฐ๋๋ ์ปฌ๋ผ๋ง ์์ฑํจ์ผ๋ก ๊ฐ๋จํ JOIN ์ฟผ๋ฆฌ๋ฅผ ๋ง๋ค ์ ์๋ค., (*20)
์ง์๋๋ ํจ์๋ ๋ค์๊ณผ ๊ฐ๋ค., (*21)
- sqlTable($table) - ๋จ์ผ ํ
์ด๋ธ ์ฌ์ฉ
- sqlJoin($tables) - JOIN ์ฟผ๋ฆฌ
- sqlLeftJoin($tables) - LEFT JOIN ์ฟผ๋ฆฌ
- sqlInnerJoin($tables) - INNER JOIN ์ฟผ๋ฆฌ
์์ฑ ๋ฐฉ๋ฒ, (*22)
- ํ
์ด๋ธ ๋ชฉ๋ก์ array๋ก ์์ฑํ์ฌ ์ฌ์ฉํ๋ค.
- key, value๋ชจ๋ ์๋ก ON์ผ๋ก JOINํ ์ปฌ๋ผ์ ์์ฑํ๋ค.
- ์์ ์ ์ธ๋์ด ์๋ ํ
์ด๋ธ์ key๊ฐ์ผ๋ก ์ฌ์ฉํ๋ฉด ์ข๋ค.
- ์ฒซ ์ ์ธ์ key๊ฐ from ์ ํ
์ด๋ธ์ด๊ณ , value๊ฐ ํ์ ๋ฐ๋ผ์ค๋ join ํ
์ด๋ธ์ด๋ค.
- value์ ๋จ์ผ ํ
์ด๋ธ์ ์ ์ด์ ํ๋๋ง JOIN ํ ์๋ ์๊ณ ,
๋ฐฐ์ด๋ก ์ฌ๋ฌ ํ
์ด๋ธ์ ์์ฑํ๋ฉด ์์ฐจ์ ์ผ๋ก JOIN๋ฌธ์ด ์์ฑ๋๋ค.
ํ
์ด๋ธ ๊ตฌ๋ฌธ ์์ฑ ์์ , (*23)
<?php
// ๋จ์ผ ํ
์ด๋ธ
$db->sqlDict('SELECT * FROM ?', sqlTable('tb_book'));
// => SELECT * FROM tb_book
// join ํ
์ด๋ธ - 1:1 ๊ด๊ณ๋ง
$tables = [
'tb_book.id' => 'tb_book_comic.b_id',
'tb_book.category' => 'tb_category.id'
];
$db->sqlDicts('SELECT * FROM ?', sqlLeftJoin($tables));
/*
SELECT *
FROM tb_book
LEFT JOIN tb_book_comic ON (tb_book.id = tb_book_comic.b_id)
LEFT JOIN tb_category ON (tb_book.category = tb_category.id)
*/
// join ํ
์ด๋ธ - ์ฒซ ํ
์ด๋ธ์ join์ด ์ฌ๋ฌ๊ฐ ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ
$tables = [
'tb_book_production.b_id' => ['tb_book.id', 'platform_withhold.b_id'],
'tb_book.pub_id' => 'tb_publisher.id',
'tb_publisher.id' => 'tb_publisher_manager.pub_id',
'tb_book.id' => 'tb_book_search.b_id'
];
$db->sqlDicts('SELECT * FROM ?', sqlLeftJoin($tables));
/*
SELECT *
FROM tb_book_production
LEFT JOIN tb_book ON (tb_book_production.b_id = tb_book.id)
LEFT JOIN platform_withhold ON (tb_book_production.b_id = production_withhold.b_id)
LEFT JOIN tb_publisher ON (tb_book.pub_id = tb_publisher.id)
LEFT JOIN tb_publisher_manager ON (tb_publisher.id = tb_publisher_manager.pub_id)
LEFT JOIN tb_book_search ON (tb_book.id = tb_book_search.b_id)
*/
3.5 ๊ธฐํ
- sqlAdd($something) - column + $something ์ฟผ๋ฆฌ๋ก ๋ณํ
- sqlStrcat($something) - concat(colum, $something) ์ฟผ๋ฆฌ๋ก ๋ณํ
- sqlPassword($something) - sql password() function
- sqlColumn($column) - ์ปฌ๋ผ๋ช
์ ์์ ํ๊ฒ ์ฌ์ฉํ๊ณ ์ถ์ ๋
- sqlWhereWithClause($where) - sqlWhere()๊ณผ ๋์ผํ์ง๋ง, 'WHERE '์ด ์กฐ๊ฑด ๋ฌธ ์์ ์ ํ๋๋ค.
- sqlRange($A, $B) - $a <= column < $b
- sqlNow() - sql now() function
4. CRUD
CRUD ์ค ๋ค์ method๋ฅผ ์ง์ํ๋ค., (*24)
- sqlInsert(table,data)
- sqlUpdate(table, data, where);
- sqlDelete(table, where)
-
sqlInsertOrUpdate(table, data, update_where = null) - INSERT INTO ~~ ON DUPLICATE KEY UPDATE ๊ตฌ๋ฌธ, (*25)
-
sqlInsertBulk(table, data_keys, data_valuess) - Bulk์ฉ sqlInsert, (*26)
- sqlInsertOrUpdateBulk(table, data_keys, data_valuess) - Bulk์ฉ sqlInsertOrUpdate
๋ณ์๋ ๋ค์๊ณผ ๊ฐ๋ค., (*27)
- table - ๋จ์ผ ํ
์ด๋ธ ๋ช
(sqlTable์ ์ ์ฉํ์ง ์์)
- data - ์ถ๊ฐ/์์ ํ ๋ฐ์ดํฐ ๋ฐฐ์ด, column => value ๋ก ๊ตฌ์ฑ๋์ด์ผ ํจ
- data_keys ์ถ๊ฐ/์์ ํ ๋ฐ์ดํฐ์ ํค ๋ฐฐ์ด
- data_valuess ์ถ๊ฐ/์์ ํ ๋ฐ์ดํฐ ๋ฐฐ์ด ๋์ด, [[column => value], [column => value] ... ] ๋ก ๊ตฌ์ฑ๋์ด์ผ ํจ
- where, update_where - ์กฐ๊ฑด ๋ฌธ (sqlWhere์ ์์ด๋ ๋จ)
5. transaction
transaction์ ๋ค์ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ ์ง์ํ๋ค., (*28)
-
transactional, (*29)
php
$success = $db->transactional(function($db) {
$db->sqlDo($sql);
});
-
sqlBegin-sqlEnd, (*30)
-
$db->sqlBegin();
dbQueries($db);
$success = $db->sqlEnd();
-
sqlEnd ๋์ sqlCommit, sqlRollback method๋ ๊ฐ๋ฅ., (*31)
6. ๊ธฐํ ๋ฑ๋ฑ
์์ฑ ๋์ด ์๋ method ๋ชฉ๋ก, (*32)
-
sqlDo($sql, ...)
- ๋จ์ ์คํ
-
sqlCount($table, $where)
- SELECT count(*) FROMย ~~ ์ ์ถ์ฝํ
-
sqlData($sql, ...)
- Dict/Object์ ๋ค๋ฅด๊ฒ SELECT์ ์ ์ฒซ๋ฒ์งธ ์ปฌ๋ผ๋ง ์ถ์ถํ๋ค, ๊ฐ์ด ์์ผ๋ฉด null
-
sqlDatas($sql, ...)
- ์์ ๋์ผํ๋ฉฐ, ๊ฐ์ด ์์ผ๋ฉด empty array
-
sqlArray($sql, ...)
- Dict์ ์ ์ฌํ์ง๋ง, key ๊ฐ์ด ์ซ์๋ก ์
๋ ฅ๋จ (PDO::FETCH_NUM)
-
sqlArrays($sql, ...)
- Dicts์ ์ ์ฌํ๊ณ , ์์ ๋์ผ
-
sqlLine($sql, ...)
- sqlArray์ ๋์ผ
-
sqlLines($sql, ...)
- sqlArrays์ ๋์ผ
-
sqlDump($sql, ...)
- query parse ๊ฒฐ๊ณผ๊ฐ์ return
-
sqlDumpBegin(); sqlDo($sql, ...); sqlDumpEnd()
- sqlDo ํธ์ถ ์ ์คํ ๋ query๋ฅผ sqlDumpEnd์์ ๋ฐ์ ์ ์๋ค.