Database explorer – výběr dvou záznamů z jedné tabulky

Allconius
Člen | 313
+
0
-

Ahoj,

potřeboval bych upravit tento dotaz:

<?php

    $result = $this->database->table($this->tabulka)
      ->where(''.$this->tabulka.'.Smazano = ?', 0)
      ->where(''.$this->tabulka.'.Rok LIKE ?', $rok)
      ->where(''.$this->tabulka.'.Cislo LIKE ?', $cislo)
      ->where(''.$this->tabulka.'.A_Osoba LIKE ?', $zpracovatel)
      ->where(':'.$this->tabulka.'(StpID):'.$this->tabulkap.'.Prijmeni LIKE ?', $prijmeni)
      ->where(':'.$this->tabulka.'(StpuID):'.$this->tabulkap.'.Prijmeni LIKE ?', $prijmeni1)
      ->where(''.$this->tabulkaa.'.Adresa LIKE ?', $adresa)
      ->order(''.$this->tabulka.'.ID DESC');
?>

Potřeboval bych aby to hledalo v $this->tabulka ve sloupci StpID i StpuID, které oba obsahují cizí klíče do tabulky $this->tabulkap , našel jsem nějaký příklad s dvojtečkama:

<?php
$authors = $context->table('author');
$authors->where(':book:book_tags.tag.name', 'PHP')
	->group('author.id')
	->having('COUNT(:book:book_tags.tag.id) > 0');
?>

ale nevím zda se to dá použít i na můj případ …

David Matějka
Moderator | 6445
+
0
-

dvojtecka se pouziva pri „has many“ smeru. v tvem pripade ta tabulka drzi ID, takze se jedna o „has one“ pristup a to je ten example v dokumentaci nad tim s dvojteckou:

$books = $context->table('book');
$books->where('author.name LIKE ?', '%Jon%');
$books->where('translator.name', 'David Grudl');
Allconius
Člen | 313
+
0
-

David Matějka napsal(a):

dvojtecka se pouziva pri „has many“ smeru. v tvem pripade ta tabulka drzi ID, takze se jedna o „has one“ pristup a to je ten example v dokumentaci nad tim s dvojteckou:

$books = $context->table('book');
$books->where('author.name LIKE ?', '%Jon%');
$books->where('translator.name', 'David Grudl');

ale když tam dám:

<?php
    $result = $this->database->table($this->tabulka)
      ->where(''.$this->tabulka.'.Smazano = ?', 0)
      ->where(''.$this->tabulka.'.Rok LIKE ?', $rok)
      ->where(''.$this->tabulka.'.Cislo LIKE ?', $cislo)
      ->where(''.$this->tabulka.'.A_Osoba LIKE ?', $zpracovatel)
      ->where(''.$this->tabulkap.'.Prijmeni LIKE ?', $prijmeni)
      ->where(''.$this->tabulkap.'.Prijmeni LIKE ?', $prijmeni1)
      ->where(''.$this->tabulkaa.'.Adresa LIKE ?', $adresa)
      ->order(''.$this->tabulka.'.ID DESC');
?>

tak mi to vytvoří dotaz:

<?php
SELECT `St`.ID
FROM `St`
LEFT JOIN `Stp` ON `St`.`StpID` = `Stp`.`StpID`
LEFT JOIN `Sta` ON `St`.`StaID` = `Sta`.`StaID`
WHERE (`St`.`Smazano` = 0) AND (`St`.`Rok` LIKE $rok) AND (`St`.`Cislo` LIKE '%%') AND (`St`.`A_Osoba`
LIKE '%') AND (`Stp`.`Prijmeni` LIKE $primeni) AND (`Stp`.`Prijmeni` LIKE $primeni1) AND (`Sta`.`Adresa` LIKE '%')
ORDER BY `St`.ID DESC
?>

ale já bych z toho potřeboval dostat něco takového:

<?php
SELECT `St`.ID
FROM `St`
LEFT JOIN `Stp` ON `St`.`StpID` = `Stp`.`StpID`
LEFT JOIN `Stp` ON `St`.`StpuID` = `Stp`.`StpID`
LEFT JOIN `Sta` ON `St`.`StaID` = `Sta`.`StaID`
WHERE (`St`.`Smazano` = 0) AND (`St`.`Rok` LIKE $rok) AND (`St`.`Cislo` LIKE '%%') AND (`St`.`A_Osoba`
LIKE '%') AND (`Stp`.`Prijmeni` LIKE $primeni) AND (`Stp`.`Prijmeni` LIKE $primeni1) AND (`Sta`.`Adresa` LIKE '%')
ORDER BY `St`.ID DESC
?>

a nějak mu říct aby $prijmeni hledal v StpID a $primeni1 v StpuID. Takhle jak to mám tak hledá $primeni i $primeni1 v StpID

David Matějka
Moderator | 6445
+
0
-

pro spojovaci klic se pouziva nazev sloupecku s FK, tedy v tvem pripade Stp.PrijmeniStpu.Prijmeni

mimochodem, doporucuju pouzivat smysluplny pojmenovani

Allconius
Člen | 313
+
0
-

David Matějka napsal(a):

pro spojovaci klic se pouziva nazev sloupecku s FK, tedy v tvem pripade Stp.PrijmeniStpu.Prijmeni

mimochodem, doporucuju pouzivat smysluplny pojmenovani

Ahoj, akorát právě nevím jak je ta syntaxe ?

<?php

     ->where('Stp.'.$this->tabulkap.'.Prijmeni LIKE ?', $prijmeni)
      ->where('Stpu.'.$this->tabulkap.'.Prijmeni LIKE ?', $prijmeni1)

?>

?

Allconius
Člen | 313
+
0
-

asi něco takového:

<?php
$this->database->table('boards')
   ->whereOr([
      'position1_id.player_id.name LIKE ?' => '%jmeno%',
      'position1_id.player_id.surname LIKE ?' => '%jmeno%',
      'position2_id.player_id.name LIKE ?' => '%jmeno%',
      'position2_id.player_id.surname LIKE ?' => '%jmeno%'
   ]);
?>

s těma podtržítkama, ale když dám:

<?php
      ->where(''.$this->tabulka.'_StpID.'.$this->tabulkap.'_Prijmeni LIKE ?', $prijmeni)
      ->where(''.$this->tabulka.'_StpuID.'.$this->tabulkap.'_Prijmeni LIKE ?', $prijm
?>

tak to hodí chybu:
Nette\InvalidArgumentException

No reference found for $St->St_StpID.

Allconius
Člen | 313
+
0
-

resp. tohle se mu nějak nelíbí:

<?php
        $result = $this->database->table('St')
            ->where('St_StpID.Stp_StpID.Prijmeni LIKE ?', $prijmeni);
?>

No reference found for $St->St_StpID.

David Matějka
Moderator | 6445
+
0
-

Ahoj, akorát právě nevím jak je ta syntaxe ?

ta syntaxe je takova, jakou jsem zminoval Stp.Prijmeni a Stpu.Prijmeni (tedy pokud jsem se neztratil v tech nesmyslnych nazvech tabulek)

Allconius
Člen | 313
+
0
-

David Matějka napsal(a):

Ahoj, akorát právě nevím jak je ta syntaxe ?

ta syntaxe je takova, jakou jsem zminoval Stp.Prijmeni a Stpu.Prijmeni (tedy pokud jsem se neztratil v tech nesmyslnych nazvech tabulek)

Ahoj ztratil :-) Protože tabulka Stpu neexistuje existuji prave jen 2 tabulky:
St:
ID, StpID, StpuID
1, 1, 2

a tabulka Stp:
StpID, Prijmeni
1, Novák
2, Jelen

a já potřebuju udělat dotaz: Najdi mi z tabulky St vsechny zaznamy kde je StpID Novák a StpuID Jelen

David Matějka
Moderator | 6445
+
0
-

zkusil si to, co jsem poslal?

Allconius
Člen | 313
+
0
-

David Matějka napsal(a):

zkusil si to, co jsem poslal?

Nevím jak, název Stpu neexistuje, není to tabulka ani název sloupce tabulky, jediný co existuje tak je StpuID jako název sloupce v tabulce St

David Matějka
Moderator | 6445
+
0
-

https://doc.nette.org/…ase/explorer#…

Řekněme, že chceme vybrat všechny knihy, které napsal autor jménem Jon. Musíme napsat pouze jméno spojovacího klíče relace a název sloupce spojené tabulky. Spojovací klíč je odvozen od jména sloupce, který odkazuje na tabulku, se kterou se chceme spojit. V našem příkladu (viz databázové schéma) je to sloupec author_id, ze kterého -stačí použít část – author.

Allconius
Člen | 313
+
0
-

David Matějka napsal(a):

https://doc.nette.org/…ase/explorer#…

Řekněme, že chceme vybrat všechny knihy, které napsal autor jménem Jon. Musíme napsat pouze jméno spojovacího klíče relace a název sloupce spojené tabulky. Spojovací klíč je odvozen od jména sloupce, který odkazuje na tabulku, se kterou se chceme spojit. V našem příkladu (viz databázové schéma) je to sloupec author_id, ze kterého -stačí použít část – author.

Ahoj, už jsem to konečně pochopil, nevěděl jsem že to jde zapsat i zkráceně , ale fungují oboje verze:

<?php
            ->where('StpID.Prijmeni LIKE ?', $prijmeni)
            ->where('StpuID.Prijmeni LIKE ?', $prijmeni1)

          ->where('Stp.Prijmeni LIKE ?', $prijmeni)
            ->where('Stpu.Prijmeni LIKE ?', $prijmeni1)
?>

děkuji moc, promiň že jsem tě s tím tak zdržel, jsem občas natvrdlej …