Salut a tous,
j'ai un propbleme avec la fonction Hash::extract sur la version 3.0 de CakePHP, je lui donne le resultat en array, mais j'ai rien en retour, j'ai check la doc, mais je crois qu'ils ne l'on pas update depuis la v2.x.
Pour avoir une idee voici le array en question :

Array
(
    [0] => App\Model\Entity\Autocomplete Object
        (
            [_properties:protected] => Array
                (
                    [id] => 1
                    [value] => Item
                    [created] => Cake\I18n\Time Object
                        (
                            [date] => 2014-10-29 18:57:25
                            [timezone_type] => 3
                            [timezone] => UTC
                        )

                    [modified] => Cake\I18n\Time Object
                        (
                            [date] => 2014-10-29 18:57:25
                            [timezone_type] => 3
                            [timezone] => UTC
                        )

                )

            [_original:protected] => Array
                (
                )

            [_hidden:protected] => Array
                (
                )

            [_virtual:protected] => Array
                (
                )

            [_className:protected] => App\Model\Entity\Autocomplete
            [_dirty:protected] => Array
                (
                )

            [_new:protected] => 
            [_errors:protected] => Array
                (
                )

            [_accessible:protected] => Array
                (
                    [*] => 1
                )

            [_repositoryAlias:protected] => Autocompletes
        )

)

Et voici l'appel a la fonction :

Hash::extract($suggestions, '{n}.Autocomplete.value')

Merci d'avance ;).

13 réponses


Xeta
Réponse acceptée

Chez moi ca fonctionne tres bien, exemple :

$test = $this->PremiumOffers
            ->find()
            ->hydrate(false)
            ->toArray();

        $array = Hash::extract($test, '{n}.price');

        //DEBUG
[
    (int) 0 => (float) 3,
    (int) 1 => (float) 8.5,
    (int) 2 => (float) 16.5,
    (int) 3 => (float) 32
]

Apres, effectivement leur exemple avec "$this->User->find("all")" ne fonctionne pas car ca renvoie un objet, et la fonction extract prend uniquement un array, je vais faire une PR pour le modifier.

Yop,

Test ça pour voir :

Hash::extract($suggestions, '{s}.Autocomplete.value');
wYm
Auteur

Salut @Xeta et merci pour ta reponse ^^, mais j'ai essaye avec :

Hash::extract($suggestions, '{s}.Autocomplete.value');

et :

Hash::extract($suggestions->toArray(), '{s}.Autocomplete.value');

Et ca n'a pas marche.

Et avec un :

->hydrate(false)

dans la requete ?

wYm
Auteur

ca n'as pas marche :

Hash::extract($suggestions->hydrate(false), '{s}.Autocomplete.value')

Error: Call to undefined method Cake\ORM\ResultSet::hydrate()

Pas sur le resultat, mais dans la requete en elle meme.

wYm
Auteur
$suggestions = $this->Autocompletes->find()->where($conditions)->all()->hydrate(false);  
// print '<pre>'; print_r($suggestions->toArray()); print '</pre>'; die();  
die(json_encode(Hash::extract($suggestions, '{s}.Autocomplete.value')));

Et j'ai eu : Error: Call to undefined method Cake\ORM\ResultSet::hydrate()

Test ca :

$suggestions = $this->Autocompletes
    ->find()
    ->where($conditions)
    ->hydrate(false)
    ->all();

Et ca, si le premier fonctionne pas :

$suggestions = $this->Autocompletes
    ->find()
    ->where($conditions)
    ->hydrate(false)
    ->toArray();
wYm
Auteur

Idem, marche pas, et en disant que ca ne marche pas, je veux dire que si je fait un print_r de $suggestions->toArray() j'ai les resultats, mais le debug de Hash::extract, retourne un tableau vide.

wYm
Auteur

Meme avec :

$suggestions = $this->Autocompletes
->find()
->where($conditions)
->hydrate(false)
->toArray();

Bon, je vais faire des tests de mon coter alors, car j'ai jamais utiliser Hash. Je te tient au courant dans 5min.

wYm
Auteur

@Xeta, oui effectivement chez moi ca marche aussi, mais avec :

Hash::extract($test, '{n}.value')

et non pas

Hash::extract($suggestions, '{n}.Autocomplete.value');

En tout cas merci pour ton aide ^^.

wYm
Auteur

@Xeta, tu sait quoi, en fait, je n'ai meme pas plus besoin de Hash::extract() avec ->hydrate(false) sur les resultats :p.