tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

RETURNING id s postgresql

před 3 lety

Facedown
Člen | 38

Ahoj,
potřebuji vrátit právě vložené ID. Zkoušel jsem metodu lastInsertId, která nefungovala a vyhodila mi vyjímku Dibi\Exception: Cannot retrieve last generated ID.

Hledal jsem a našel jsem syntaxi s RETURNING id. Můj kód vypadá takto:

$id = $this->database->query(
    'INSERT INTO subscribers(email, password) VALUES
    (?, ?) RETURNING id',
    $email,
    $this->cipher->encrypt($password)
);

$this->database je objekt typu Dibi\Connection

Zkoušel obraty jako query(…)->fetchSingle() nebo pouze fetchSingle(…), ale bez úspěchu.
V prvním případě s query(…)->fetchSingle() dostanu error Call to a member function fetchSingle() on integer, v druhém případě zase dostanu ID s 0.

Kód jsem vložil přímo do admineru a fungovalo to v pohodě.

Postgres zkouším poprvé, takže je možné, že dělám někde fatální chybu.

Díky za odpověd.

před 3 lety

Milo
Nette Core | 1119

S Dibi 3.0.5 funguje dobře:

<?php

require __DIR__ . '/vendor/autoload.php';

$db = new Dibi\Connection([
    'driver' => 'postgre',
    'host' => 'localhost',
    'username' => 'test',
    'password' => '*****',
    'dbname' => 'test',
]);


$id = $db->query('INSERT INTO book (title) VALUES (?) RETURNING id', 'Dibi')->fetchSingle();
var_dump($id);

před 3 lety

Facedown
Člen | 38

Milo napsal(a):

S Dibi 3.0.5 funguje dobře:

<?php

require __DIR__ . '/vendor/autoload.php';

$db = new Dibi\Connection([
    'driver' => 'postgre',
    'host' => 'localhost',
    'username' => 'test',
    'password' => '*****',
    'dbname' => 'test',
]);


$id = $db->query('INSERT INTO book (title) VALUES (?) RETURNING id', 'Dibi')->fetchSingle();
var_dump($id);

Už mi to jde, měl jsem jako driver nastaven pdo. Myslel jsem, že se pdo používá napříč různými databázemi, z jakého důvodu mi to tedy nefungovalo? Jinak, díky :)

před 3 lety

Milo
Nette Core | 1119

Nevím přesně proč (asi protože se u PDO nedá snadno zdetekovat, že výsledkem SQL dotazu je result set), dělá dibi detekci a pro INSERT natvrdo vrací integer.