tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

SQLite3 a spojení více tabulek, left join

před 7 lety

kralik
Člen | 171

Ahoj lidičky,
prosím nevíte jak používat LEFT JOIN v DIBI spolu s SQLite 3.

Nevím zda to DIBI umí ve spojení s SQLite3.

Verze: Dibi 2.0.1, PHP 5.3.5, Nette Framework 2.0.3 (revision eb558ae released on 2012–04–04)

zkouším jak zápis samotné QUERY tak takto

<?php
$row = \dibi::select('company.nazev, cinnost.nazev, work.datum, work.od, work.do, work.trvani,work.detail, work.status')
                ->from('work')
                ->leftJoin('company')->on('company.id = work.company_id')//otoceno pokus
                ->leftJoin('cinnost')->on('cinnost.id = work.cinnost_id')
                ->fetchAll();
?>

Samotný Select je správně protože v Admineru funguje, ale v DIBI se mi nějak nedaří.

Prosím poraďte.

Moc díky

před 7 lety

Milo
Nette Core | 1119

Použití se mi zdá být správné. Dostáváš nějakou chybu? Jak vypadá vygenerované SQL?

před 7 lety

kralik
Člen | 171

bohužel žádnou chybu jen $row = NULL

bohužel se mi zatím nepodařilo získat výslednou SQL

neporadil bys mi jak na to?

moc díky

před 7 lety

Milo
Nette Core | 1119
dibi::select('*')->from('tab')->test();

// EDIT: ehm, to je blbě
dibi::query('SELECT * FROM ...')->test();

// takhle
dibi::test('SELECT * FROM ...');

Editoval Milo (20. 7. 2012 16:00)

před 7 lety

kralik
Člen | 171

Prosím mohl by si mi napsat detailnější query.

Jak si mohu vybrat slouce z drute tabulky?

Příkaz SELECT company.nazev … nefunguje.

Tento taky nefuguje:

<?php
\dibi::company('SELECT company, datum, od, do, trvani, detail, status FROM work');
?>

EDIT: ještě jsem se dočetl, že lze použít $fluent->leftJoin(„table“)->on(…)
Je to možné, jak to funguje?

Moooc díky

Editoval kralik (23. 7. 2012 9:38)

před 7 lety

kralik
Člen | 171

Znovu jsem udělal celé QUERY a nyní to už jede.

Tento dotaz udělá to co má

<?php
$row = \dibi::query('
SELECT [company.nazev] as firma, [cinnost.nazev] as cinnost, [datum], [od], [do], [trvani], [detail], [status]
FROM [work]
LEFT JOIN [company] ON [work].[company_id] = [company].[id]
LEFT JOIN [cinnost] ON [work].[cinnost_id] = [cinnost].[id]
ORDER BY [company_id] DESC
')->fetchAll();
?>

Mooc díky za věnovaný čas

před 7 lety

Milo
Nette Core | 1119

Když máš v tabulkách stejné názvy sloupců a chceš je získat asociativním fetchem (tak to dělá dibi), musíš je aliasovat jinak dostaneš vždy jen jeden.

SELECT
    work.name AS [workName],
    company.name AS [companyName],
    cinnost.name AS [cinnostName]
FROM
    ...

Následující funguje bez problému:

use Nette\Diagnostics\Debugger;

require '/var/www/dev/nette/Nette/loader.php';
Debugger::$strictMode = TRUE;
Debugger::enable(FALSE);

require '/var/www/dev/dibi/dibi/dibi.php';

$dbConfig = array(
    'driver' => 'sqlite3',
    'database' => '/tmp/test.db3',
    'lazy' => FALSE,
    'profiler' => TRUE,
);

$initDatabase = !file_exists($dbConfig['database']);

$db = new DibiConnection($dbConfig);

if ($initDatabase) {
    $db->query('CREATE TABLE company (id PRIMARY KEY, name VARCHAR)');
    $db->query('CREATE TABLE cinnost (id PRIMARY KEY, name VARCHAR)');
    $db->query('
        CREATE TABLE work (
            id INTEGER,
            name VARCHAR,
            company_id INTEGER,
            cinnost_id INTEGER,
            FOREIGN KEY(company_id) REFERENCES company(id) ON UPDATE CASCADE ON DELETE CASCADE,
            FOREIGN KEY(cinnost_id) REFERENCES cinnost(id) ON UPDATE CASCADE ON DELETE CASCADE
        )
    ');

    $db->query('INSERT INTO company VALUES (%i, %s)', 1, 'firma 1');
    $db->query('INSERT INTO company VALUES (%i, %s)', 2, 'firma 2');
    $db->query('INSERT INTO cinnost VALUES (%i, %s)', 1, 'cinnost 1');
    $db->query('INSERT INTO cinnost VALUES (%i, %s)', 2, 'cinnost 2');
    $db->query('INSERT INTO work VALUES (%i, %s, %i, %i)', 1, 'work 1 1-1', 1, 1);
    $db->query('INSERT INTO work VALUES (%i, %s, %i, %i)', 2, 'work 2 1-2', 1, 2);
}

dump($db->query('PRAGMA foreign_keys')->fetch());
dump($db->query('SELECT * FROM company')->fetchAll());
dump($db->query('SELECT * FROM cinnost')->fetchAll());
dump($db->query('SELECT * FROM work')->fetchAll());

dump($db->query('
    SELECT
        work.name AS [workName],
        company.name AS [companyName],
        cinnost.name AS [cinnostName]
    FROM
        work
        LEFT JOIN company ON company_id = company.id
        LEFT JOIN cinnost ON cinnost_id = cinnost.id
')->fetchAll());