Hash::extract sous CakePHP 3.0

Par wYm, il y a 11 ans


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, il y a 11 ans

Yop,

Test ça pour voir :

Hash::extract($suggestions, '{s}.Autocomplete.value');
wYm, il y a 11 ans

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.

Xeta, il y a 11 ans

Et avec un :

->hydrate(false)

dans la requete ?

wYm, il y a 11 ans

ca n'as pas marche :

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

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

Xeta, il y a 11 ans

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

wYm, il y a 11 ans
$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()

Xeta, il y a 11 ans

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, il y a 11 ans

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, il y a 11 ans

Meme avec :

$suggestions = $this->Autocompletes ->find() ->where($conditions) ->hydrate(false) ->toArray();
Xeta, il y a 11 ans

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

Xeta, il y a 11 ans

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.

wYm, il y a 11 ans

@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, il y a 11 ans

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