ORM query na samostatnu tabulku

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

Ahojte. Mam jeden maly problem, ktory ale potrebujem cim skor vyriesit. Pouzivam ORM model a rucne som si do vygenerovanej databazy vytvoril samostatnu tabulku s nazvami miest. Akym sposobom mozem teraz pristupovat k tejto „samostatnej“ tabulke? DAKUJEM

romiix.org
Člen | 343
+
0
-

Normálne cez model ako k ostatným tabuľkám. Daj sem napr. kus kódu ktorý by si chcel použiť a neide ti, alebo niečo podobné. Takto sa ťažko radí.

d4ncul
Člen | 41
+
0
-

Napr. tymto sposobom ziskavam data z repozitarov konkretnych modelov. V uvedenom priklade ziskavam poslednych 5 platieb. Mam napr. model Company a k nemu prisluchajuci repozitar. Potreboval by som ale k zoznamu miest pristupovat globalne. Vsetky moje presentery dedia od BasePresenter. A tu je kamen urazu, ako z neho volat metodu modelu, pomocou ktorej ziskam zoznam miest? DAKUJEM

public function getLatestPayments($company_id)
	{
		$query = $this->getEntityManager()->createQueryBuilder();
		$query->select('p')
			  ->from('Payment', 'p')
			  ->where('p.company = :company_id')->setParameter('company_id', $company_id)
			  ->orderBy('p.pay_date', 'DESC')
			  ->setMaxResults(5);

		return $query->getQuery()->getResult();
	}
romiix.org
Člen | 343
+
0
-

Vôbec si nie som istý, či odpovedám k veci, ale skúsim to.

Model CityModel.php:

<?php

class CityModel extends Nette\Object
{
	/** @var Nette\Database\Connection */
	protected $connection;

	/** @var string */
	public $table;

	public function __construct(Nette\Database\Connection $db)
	{
		$this->connection = $db;
	}

	/**
	 * @return Nette\Database\Table\Selection
	 */
	public function getTable()
	{
		return $this->connection->table($this->table);
	}

	public function getAll()
	{
		return $this->getTable()->fetchPairs("id_city", "name");
	}
}

Konfigurácia config.neon:

common:
	services:
		cityModel:
			class: CityModel
			setup:
				- $table(city)

Túto službu následne injectúť a použiť:

$this->cityModel->getAll();
Tomáš Jablonický
Člen | 115
+
0
-

@d4ncul:

Uděl si repository, kde budou tyto kusy kodu. Namapuj to do entity a v nejvyšším BasePresenteru jen vstříkni EntityManager a pak už jen lehce v každém presenteru můžeš udělat toto:

BasePresenter

<?php

abstract BasePresenter extends Presenter
{
	/** @var EntityManager $em */
	protected $em;

	public function injectEntityManager(EntityManager $em)
	{
		$this->em = $em;
	}
}

?>

NajkyPresenter

<?php

class NejakyPresenter extends BasePresenter
{

	public function actionDefault()
	{
		...
		$data = $this->em->getRepository('Entita')
				->getLatestPayments($this->company_id);
		...
	}
}
?>
d4ncul
Člen | 41
+
0
-

Dakujem romiix.org aj jablon!
Nakoniec som to vyriesil priblizne takym sposobom, ako ste mi poradili.

Tomáš Jablonický
Člen | 115
+
0
-

Ukaž jestli to máš správně :-)