Nette\Database si pamatuje parametry where z minulého dotazu

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

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

formatuj kod

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

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

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

takhle bys jednu instanci nevyuzival. ukaz, jak presne ten kod vypada.

Tohle je nějaká nová verze nette?

ne, tohle se delo vzdy

bluray
Člen | 178
+
0
-

David Matějka napsal(a):

takhle bys jednu instanci nevyuzival. ukaz, jak presne ten kod vypada.

Tohle je nějaká nová verze nette?

ne, tohle se delo vzdy

Editoval jsem příspěvek

David Matějka
Moderator | 6445
+
+2
-
$this->table = $this->db->table($table);

je spatne, pro kazdy dotaz musis vytvorit novou instanci selection (tedy to volani table($table))