Tietokanta
Pikessä tietokantakyselyt suoritetaan \Pike\Db
-luokalla, joka on on ohut wräpperi \PDO
-abstraktion ympärille.
use \Pike\Db;
final class MyCtrl {
public function __construct(Db $db) {
$this->db = $db;
}
// tai..
public function myMethod(Db $db): void {
// tee jotain $db:llä
}
}
Sisällysluettelo
- Käyttöönotto
- Tiedon insertointi, yksi rivi
- Tiedon insertointi, useita rivejä
- Tiedon hakeminen, yksi rivi
- Tiedon hakeminen, useita rivejä
- Tiedon päivittäminen
- Tiedon poistaminen
Käyttöönotto
Esimerkki:
index.php
$myCtxInitFn = function (\Pike\AppContext $ctx, \Pike\ServiceDefaults $defaults): void {
// MariaDb/MySQL
$ctx->config = $defaults->makeConfig([
'db.host' => '127.0.0.1', // oletus '127.0.0.1'
'db.database' => 'mydb', // oletus ''
'db.user' => 'user', // oletus ''
'db.pass' => 'pass', // oletus ''
'db.tablePrefix' => 'pike_', // oletus ''
'db.charset' => 'utf8mb4', // oletus 'utf8mb4'
]);
// Sqlite
$ctx->config = $defaults->makeConfig([
'db.driver' => 'sqlite',
'db.database' => __DIR__ . '/polku/tiedostoon.db', // Voi olla myös ':memory:'
]);
//
$ctx->db = $defaults->makeDb();
};
$app = new \Pike\App([new MyBootstrapModule], $myCtxInitFn);
$app->handleRequest(...);
MyBootstrapModule.php
final class MyBootstrapModule {
/**
* @param \Pike\AppContext $ctx
*/
public function init(\Pike\AppContext $ctx): void {
$ctx->db->open();
}
}
Tiedon insertointi, yksi rivi
$data = (object) ['foo' => 'value 1', 'bar' => 'value 2'];
[$qList, $values, $columns] = $db->makeInsertQParts($data);
//
$numAffectedRows = $db->exec("INSERT INTO `Products` ({$columns}) VALUES ({$qList})",
$values);
if ($numAffectedRows > 0)
echo $this->db->lastInsertId(); // '14'
else
; // Tee jotain
Vain valitut kentät
$data = (object) ['foo' => 'value 1', 'bar' => 'value 2', 'baz' => 'value 3'];
$onlyTheseColumns = ['foo', 'baz'];
[$qList, $values, $columns] = $db->makeInsertQParts($data, $onlyTheseColumns);
//
$qList; // '?,?'
$columns; // '`foo`,`baz`'
//
$numAffectedRows = $db->exec("INSERT INTO `Products` ({$columns}) VALUES ({$qList})",
$values);
Tiedon insertointi, useita rivejä
$data = [
(object) ['foo' => 'value1', 'bar' => 'another value'],
(object) ['foo' => 'value2', 'bar' => 'another value2'],
];
[$qGroups, $values, $columns] = $db->makeBatchInsertQParts($data);
//
$numAffectedRows = $db->exec("INSERT INTO `Products` ({$columns}) VALUES {$qGroups}",
$values);
if ($numAffectedRows > 0)
echo $this->db->lastInsertId(); // '14'
else
; // Tee jotain
Vain valitut kentät
$data = [(object) ['foo' => 'value 1', 'bar' => 'value 2', 'baz' => 'value 3'],
(object) ['foo' => 'value 4', 'bar' => 'value 5', 'baz' => 'value 6']];
$onlyTheseColumns = ['bar', 'baz'];
[$qGroups, $values, $columns] = $db->makeBatchInsertQParts($data, $onlyTheseColumns);
//
$qGroups; // '(?,?),(?,?)'
$columns; // '`bar`,`baz`'
//
$numAffectedRows = $db->exec("INSERT INTO `Products` ({$columns}) VALUES {$qGroups}",
$values);
Tiedon hakeminen, yksi rivi
$row = $db->fetchOne("SELECT `foo`,`bar` FROM Products WHERE `id`=?", [1]);
if ($row)
echo $row['foo']; // 'value'
else
; // $row === null|false, tee jotain
Tiedon hakeminen, useita rivejä
$rows = $db->fetchAll("SELECT `foo`,`bar` FROM Products WHERE `id`<?", [3]);
if ($rows)
echo $rows[0]['foo']; // 'value'
else
; // $rows === [], tee jotain
Tiedon päivittäminen
$data = (object) ['foo' => 'value 1', 'bar' => 'value 2'];
[$columns, $values] = $db->makeUpdateQParts($data);
//
$numAffectedRows = $db->exec("UPDATE `Products` SET {$columns} WHERE `id`=?",
array_merge($values, [1]));
if ($numAffectedRows > 0)
; // ok
else
; // Tee jotain
Vain valitut kentät
$data = (object) ['foo' => 'value 1', 'bar' => 'value 2', 'baz' => 'value 3'];
$onlyTheseColumns = ['foo', 'bar'];
[$columns, $values] = $db->makeUpdateQParts($data, $onlyTheseColumns);
//
$columns; // '`foo`=?,`bar`=?'
//
$numAffectedRows = $db->exec("UPDATE `Products` SET {$columns} WHERE `id`=?",
array_merge($values, [1]));
Tiedon poistaminen
$numAffectedRows = $db->exec("DELETE FROM Products WHERE `id`=?", [1]);
if ($numAffectedRows > 0)
; // ok
else
; // tee jotain