SELECT z více tabulek, repozitáře
- Tymikes
- Člen | 63
Zdravím,
snažím se dosáhnout toho SQL
SELECT *
FROM ukoly
,dohled
, users
WHERE (ukoly
.id_ukolu
=
dohled
.id_ukolu
AND
dohled
.id_uzivatele
LIKE writer)
GROUP BY ukoly
.id_ukolu
$uzivatel = $this->user->getIdentity()->username;
$this->template->ukoly = $this->ukoly->findAll()->where('ukoly.id_ukolu','dohled.id_ukolu')
->where ("dohled.id_uzivatele", $uzivatel)
->group('ukoly.id_ukolu');
Najde si ostatní klíče, pokud vybírám jen z tabulky úkoly? Jak udělám, abych měl přístup k ostatním tabulkám, ale zároveň nepoužil přímo celou database. Mám vytvořený jeden abstraktní repozitář a zbylé ho rozšiřují.
- CZechBoY
- Člen | 3608
V repozitáři si ulož Nette\Database\Context
a můžeš
pracovat s databází jak se ti zlíbí.
Konkrétně ten tvůj dotaz
$uzivatelID = $this->user->getId();
$this->db->table('ukoly')
->select('ukoly.*')
->select(':dohled.*')
->select(':dohled.users.*')
->where(':dohled.id_uzivatele', $uzivatelID)
->group('ukoly.id_ukolu');
ps. ano změnil jsem to na id, protože v databázi máš sloupec id_uzivatele a ne jmeno_uzivatele…
- Tymikes
- Člen | 63
Takhle vypadá repozitář.
<?php
namespace App\Model;
use Nette\Object;
use Nette\Database\Context as database;
/**
* Abstraktní repozitář.
*/
abstract class Repozitar extends Object
{
/** @var database */
protected $database;
/** @var string */
protected $table;
public function __construct(database $database)
{
$this->database = $database;
}
$this->ukoly->database->table('ukoly')
...
Tak mi napíše, že Úkol Repozitář nezná database.
//Tak pokud to udělám přímo, že si dám předám databázi přes constructor, tak to funguje, ale jinak ne.
Editoval Tymikes (10. 4. 2016 19:43)
- Tymikes
- Člen | 63
<?php
namespace App\Model;
/**
* Repozitář pro práci s tabulkou 'ukoly'
*/
class UkolRepozitar extends Repozitar
{
protected $table = 'ukoly';
function findByUser($uzivatel) {
return $this->findAll()->select('ukoly.*')
->select(':dohled.*')
->where(':dohled.id_uzivatele', $uzivatel)
->group('ukoly.id_ukolu');
}
}
Jop funguje díky :) akorát ještě musím posílat toho uživatele no :)
- CZechBoY
- Člen | 3608
No potom si ještě můžeš můžeš udělat nějakou fasádu, která to tam
bude posílat za tebe.
Třeba MojeUkolyRepozitar
, která bude obyčejná třída
(dědící Nette\Object), normálně zaregistrovaná jako služba
v konfiguráku.
class MojeUkolyRepozitar extends Nette\Object
{
private $user;
private $ukolRepozitar;
public function __construct(Nette\Security\User $user, UkolRepozitar $ukolRepozitar)
{
$this->user = $user;
$this->ukolRepozitar = $ukolRepozitar;
}
public function findAll()
{
return $this->ukolRepozitar($user->getId());
}
}
V presenteru klasicky injectneš/předáš konstruktorem a zavoláš metodu nad fasádou.
class MojeUkolyPresenter extends Nette\Application\UI\Presenter
{
/**
* @var MojeUkolyRepozitar
* @inject
*/
public $mojeUkolyRepozitar;
public function actionDefault()
{
$this->mojeUkoly = $this->mojeUkolyRepozitar->findAll();
}
}