Unexpected type of parameter: array

janbenes123
Člen | 3
+
0
-

Zdravím, mám tento druh pole, který se snažím poslat do databáze, problém nastává u pole ‚product_labels‘

array
'title' => 'Product 3'
'price' => '65'
'published_at' => '2022-08-31'
'category' => 'B'
'product_labels' => array
0 => 'E'
1 => 'F'
'active' => true

Po odeslání formuláře, si zavolám metodu postFormSucceeded() a předám jí parametry výše, má otázka je, proč mi tracy hlásí Unexpected type of parameter: array, jako databázi používám MySQL, přes PhPmyadmin, datový typ ‚product_labels‘ mám nastaven jako ENUM, zkoušel jsem i SET, ale výsledek je totožný.

 public function postFormSucceeded(array $data): void
    {
        $post = $this->database
            ->table('posts')
            ->insert($data);

        $this->flashMessage("Úspěšně vytvořeno/uloženo.", 'success');
        $this->redirect('Post:show', $post->id);
    }

Děkuji.

Marek Bartoš
Nette Blogger | 1165
+
+1
-

A jak by se pole do sloupce v databázi mělo vložit? Enum dovoluje pouze jednu hodnotu, ne více. Více hodnot se standardně řeší vazbou na další tabulku.

Pavel Kravčík
Člen | 1180
+
0
-

Pokud nad tím nepotřebuješ často vyhledávat (v novějších verzích MySQL už nově jde), tak používáme JSON.

janbenes123
Člen | 3
+
0
-

Udělal jsem menší prasárnu, ale pro mé potřeby to stačilo.

public function postFormSucceeded(array $data): void
    {

        $data['product_labels'] = json_encode($data['product_labels']);
        $data['product_labels'] = str_replace(array('[',']',"\""),'',$data['product_labels']);

        $id = $this->getParameter('id');

        if ($id) {
            $post = $this->database
                ->table('posts')
                ->get($id);
            $post->update($data);

        } else {
            $post = $this->database
                ->table('posts')
                ->insert($data);
        }


        $this->flashMessage("Úspěšně vytvořeno/uloženo.", 'success');
        $this->redirect('Post:show', $post->id);
    }

Po úpravě vypadají data co ukládám do databáze takto. Nevěděl jsem, že databáze nepřijímá array. Jsem zelenáč.

array
'title' => 'Product 1'
'price' => '85'
'published_at' => '2022-09-16'
'category' => 'C'
'product_labels' => 'D,E'
'active' => true

Děkuji za pomoc.

Pepino
Člen | 249
+
+3
-

@janbenes123 koukni na funkce implode a explode

m.brecher
Generous Backer | 735
+
0
-

@PavelKravčík omlouvám se za odbočení od tématu vlákna, „v novějších verzích MySQL už nově jde vyhledávat“ – máš na mysli fulltextové vyhledávání? To tradičně v MySQL nebylo moc prakticky použitelné, nově je to dobře udělané? Máš s tím nějaké praktické zkušenosti?

Editoval m.brecher (12. 9. 2022 20:54)

Pavel Kravčík
Člen | 1180
+
0
-

m.brecher napsal(a):

@PavelKravčík omlouvám se za odbočení od tématu vlákna, „v novějších verzích MySQL už nově jde vyhledávat“ – máš na mysli fulltextové vyhledávání ?? To tradičně v MySQL nebylo moc prakticky použitelné, nově je to dobře udělané ?? Máš s tím nějaké praktické zkušenosti ??

Řešili jsme to v době, kdy nám přišlo zajímavé použít to pro nějaké uživatelské nastavení, které se převážně jen čte (např. otevřené či zavřené menu v administraci apod.). Ale v té době (myslím 5.5) to naše DB vůbec nepodporovala, takže jsme to vlastně nepoužili (kromě malého blogu na tagy). Na nějaké hledání stále preferujeme nějakou vazební tabulku. Na full-text bude lepší Elastic.

janbenes123
Člen | 3
+
0
-

Pepino napsal(a):

@janbenes123 koukni na funkce implode a explode

Děkuji, o tomto jsem nevěděl.