Náhrada za deprecated metodu fetchField()

gizer
Člen | 67
+
0
-

Zdravím,

chtěl jsem se zeptat jakým způsobem mohu nahradit deprecated metodu fetchField(). Použil jsem ji v továrně na formuláře při načítání hodnot z databáze ve funkci setDefaultValue(). Vše perfektně funguje i v Nette v3. Pouze je tato metoda už zastaralá a nevím čím ji nahradit.

//část kódu z továrny na formuláře

$form->addText('a11', 'a11:')
        ->setDefaultValue($this->database->table('mapa')->fetchField('a11'));

Děkuji moc za případnou radu.

ForestCZE
Člen | 209
+
0
-

gizer napsal(a):

Zdravím,

chtěl jsem se zeptat jakým způsobem mohu nahradit deprecated metodu fetchField(). Použil jsem ji v továrně na formuláře při načítání hodnot z databáze ve funkci setDefaultValue(). Vše perfektně funguje i v Nette v3. Pouze je tato metoda už zastaralá a nevím čím ji nahradit.

//část kódu z továrny na formuláře

$form->addText('a11', 'a11:')
        ->setDefaultValue($this->database->table('mapa')->fetchField('a11'));

Děkuji moc za případnou radu.

Ahoj, zkus fetch

gizer
Člen | 67
+
0
-

To jsem zkoušel a metoda fetch(‚a11‘) mně vrací hodnotu primárního klíče.

F.Vesely
Člen | 369
+
+1
-

fetch()->a11

Kamil Valenta
Člen | 822
+
+5
-

Není dobré po fetch() přímo sahat na sloupec, protože ta Selectiona nemusí vrátit žádný záznam.

F.Vesely
Člen | 369
+
0
-

@kamil_v Predpokladal jsem, ze to vi. :) Ale mas pravdu, mel jsem to tam doplnit.

Kamil Valenta
Člen | 822
+
0
-

Spíš by mne zajímalo, proč je fetchField deprecated, protože ona testovala, zda výsledek dotazu není false. Také tu metodu dost používám a povede mě to k tomu, že si ji ve stejném duchu napíšu sám…

David Grudl
Nette Core | 8239
+
+2
-

Deprecated je pouze argument ve fetchField(), volání bez argumentu (tj. vrácení hodnoty z prvního sloupce) normálně funguje.

gizer
Člen | 67
+
0
-

Díky moc,
ten zápis fetch()->a11 taky funguje stejně jako fetchfield(‚a11‘). Zadával jsem předtím a11 jako argument stejně u fetchfield. Jsem prostě začátečník. Nevím akorát proč kamil_v tvrdí, že není dobré po fetch() přímo sahat na sloupec a že to nemusí vrátit žádný záznam? Existuje snad ještě i lepší řešení, jak si sáhnout přímo na konkrétní sloupec v DB tabulce?
Každopádně ještě jednou moc děkuji za radu.

Martk
Člen | 661
+
0
-

Protože to vede k chybám, když nebudeš mít záznam. PHP vygeneruje notice zprávu a hodnota bude null.

$test = null;

var_dump($test->a11);

Proč nepoužiješ to co napsal David? Když chceš fetchnout jen jeden sloupec, tak budeš mít v selectu jen jeden sloupec a vrátí ti to co ve starší verzi.

SELECT a11 FROM ...

a pak

$row->fetchField();

Editoval Martk (15. 4. 2020 18:29)

Kamil Valenta
Člen | 822
+
0
-

gizer napsal(a):

Nevím akorát proč kamil_v tvrdí, že není dobré po fetch() přímo sahat na sloupec a že to nemusí vrátit žádný záznam?

Zkus si:

$db->table('name')->where('1 = 1')->fetch()->col;

vs.

$db->table('name')->where('1 = 0')->fetch()->col;

V prvním případě se Tě vrátí ActivRow, nad kterým zavoláš $row->col;
Ve druhém případě fetch() vrátí false, a při pokusu o vyhodnocení false->col to úplně nedopadne.

Do where samozřejmě může vstoupit parametr a ty dopředu nevíš, zda db vrátí nějaký záznam, nebo ne…

F.Vesely
Člen | 369
+
+1
-

Jen doplnim, ze fetch() od verze 3 vraci misto false null, pokud nic nenajde.

gizer
Člen | 67
+
0
-

Díky všem za náměty. Určitě je lepší řešení vyhnout se chybám a použít např. nejdříve ten SELECT sloupce a pak teprve provést fetch nebo fetchfield

$row->fetchField();

Editoval gizer (15. 4. 2020 21:47)