Oznámení
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());