Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Tymikes
Člen | 63
+
0
-

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
+
+1
-

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
+
0
-

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)

CZechBoY
Člen | 3608
+
+1
-

V repozitari si udelej metodu findByUser a ta bude obsahovat kod co jsem psal. Samozrejme s return.

Tymikes
Člen | 63
+
0
-
<?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
+
0
-

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();
	}
}
Tymikes
Člen | 63
+
0
-

Kouknu na to zítra, díky :)