Nette\Database si pamatuje parametry where z minulého dotazu
- bluray
- Člen | 178
Dobrý den, volám nad stejnou tabulkou hned za sebou dva dotazy a nette mi
přidává do toho druhého where z prvního dotazu:
$this->db->table("groups")->where(["owner" => $userId, "current" => true])->fetch();
Provede se dotaz:
`SELECT *
FROM groups
WHERE (owner
= 'jmeno@centrum.cz') AND
(current
= 1)`
a potom volám dotaz:
return $this->db->table(„groups“)->where([„owner“ ⇒
$userId])->select(„*“)->fetchAll();
Provede dotaz:
SELECT *
FROM groups
WHERE (owner
= 'jmeno@centrum.cz') AND
(current
= 1)
Mimochodem když nevolám to select(„*“) tak dotaz vrací jenom select
idGroup.
Používám nejnovější verzi nette.
Díky za radu
- David Matějka
- Moderator | 6445
opravdu ten kod mas tak, jak pises? vypada to, jako bys vyuzival stejnou instanci selection.
Mimochodem když nevolám to select(„*“) tak dotaz vrací jenom select idGroup.
to je ocekavane, nette optimalizuje dotaz a vybira pouze ty sloupecky, ke kterym bylo predtim pristoupeno
- Mysteria
- Člen | 797
Zkontroluj si, jestli to náhodou nevoláš na stejném objektu dvakrát, protože třeba tohle:
$table = $this->database->table('test');
echo $table->where('name = ?', 'AAA'); // ... WHERE name = 'AAA';
echo $table->where('surname = ?', 'BBB'); // ... WHERE name = 'AAA' AND surname = 'BBB';
echo $this->database->table('test')->where('surname = ?', 'BBB'); // ... WHERE surname = 'BBB';
Jinak ->select(‚*‘) je zbytečnost uvádět, Nette používá cache, vybírá se pouze to, co později použiješ. Pokud nepoužiješ později nic (třeba uděláš jenom dump()) tak vybere jenom primární klíč (tvůj případ). Když pak něco začneš skutečně vypisovat, tak to bude vybírat to, co potřebuješ.
// Sakra pozdě… :D
Editoval Mysteria (12. 7. 2016 22:31)
- bluray
- Člen | 178
No stejnou instanci využívám. Celá třída vypadá takto:
abstract class BaseRepository implements IRepository{
/**
* @var Context
*/
private $db;
/**
* @var Selection
*/
private $table;
/**
* @param Context $context
* @param string $table
*/
public function __construct(Context $context, $table) {
$this->db = $context;
$this->table = $this->db->table($table);
}
/**
* @return Context
*/
protected function getContext(){
return $this->db;
}
/**
* @param array $data
* @return bool|int|\Nette\Database\Table\IRow
* @throws EntityExistsException
*/
public function add(array $data) {
try{
return $this->table->insert($data);
}catch (UniqueConstraintViolationException $ex){
if($ex->getCode() == 23000)
throw new EntityExistsException("Tato položka je již v databázi");
}
return null;
}
/**
* @param array $data
* @param array $by
*/
public function update(array $data, array $by = null) {
$this->table->where($by)->update($data);
}
/**
* @param array $where
*/
public function delete(array $where) {
$this->table->where($where)->delete();
}
/**
* @return Selection
*/
public function getAll() {
return $this->table;
}
/**
* @param int $id
* @return \Nette\Database\Table\IRow
*/
public function getById($id) {
return $this->table->get($id);
}
/**
* @param array $by
* @return Selection
*/
public function getBy(array $by) {
return $this->table->where($by);
}
/**
* @return int
*/
public function count() {
return $this->table->count();
}
/**
* @param array $by
* @return int
*/
public function countBy(array $by) {
return $this->table->where($by)->count();
}
}
a pak 2× volám getBy() jak to tedy řešit?
to je ocekavane, nette optimalizuje dotaz a vybira pouze ty
sloupecky, ke kterym bylo predtim pristoupeno
`
Takže musím vždy vypsat všechny sloupečky do select? Tohle je nějaká
nová verze nette? já nette neviděl asi půl roku ted jsem se k němu vrátil
a myslím že jsem to takhle dřív taky dělal a ted se docela divím…
Editoval bluray (12. 7. 2016 22:42)
- David Matějka
- Moderator | 6445
takhle bys jednu instanci nevyuzival. ukaz, jak presne ten kod vypada.
Tohle je nějaká nová verze nette?
ne, tohle se delo vzdy
- David Matějka
- Moderator | 6445
$this->table = $this->db->table($table);
je spatne, pro kazdy dotaz musis vytvorit novou instanci selection (tedy to
volani table($table)
)