2
votes

Obtenir la valeur d'un objet dans une collection

J'utilise DataTables as Service de Yajra dans mon application Laravel.

J'ai une collection comme celle-ci:

Collection {#1178
    #items: array:2 [
    0 => array:7 [
      "email" => "user1@example.com"
      "id" => 6
      "emailBlacklisted" => false
      "smsBlacklisted" => false
      "modifiedAt" => "2019-02-05T17:20:17.723+01:00"
      "listIds" => array:2 [
        0 => 2
        1 => 3
      ]
      "attributes" => {#1139
        +"NAME": "Doe"
        +"FIRSTNAME": "John"
      }
    ]
    1 => array:7 [
      "email" => "user2@example.com"
      "id" => 1
      "emailBlacklisted" => false
      "smsBlacklisted" => false
      "modifiedAt" => "2019-02-05T21:12:04.094+01:00"
      "listIds" => array:1 [
        0 => 2
      ]
      "attributes" => {#1143}
    ]
  ]
}

Dans ma vue en lame, j'affiche la valeur de l'e-mail avec { {$ email}} -> Simple

Je pense que c'est un problème très simple pour vous ...

Mais je ne peux pas afficher la valeur de la clé des attributs. (Je veux montrer le NOM: Doe). -> attributes est un objet dans ma collection.

Merci de m'aider à déverrouiller ...


0 commentaires

3 Réponses :


-1
votes

Vous devez simplement faire quelque chose comme:

@foreach($collection as $item)
  {{$item->NAME}}
@endforeach

Remarque: NAME doit être une clé dans la variable des attributs.

La variable des attributs est protégée, vous pouvez donc ' t le référencer directement de l'extérieur de l'objet. La valeur sera automatiquement mappée si vous la référencez via l'objet qui la possède.


2 commentaires

Si vous voyez attentivement, vous devez être conscient que chaque élément n'est pas une instance éloquente et vous pouvez accéder directement à l'attribut attributes . C'est aussi la relation appartient à dans ce cas


Assez juste, mais pourquoi pas? Comment et pourquoi sont-ils convertis en tableaux?



0
votes

Si je comprends bien, vous voulez pouvoir afficher la clé et la valeur des attributs.

Si vous utilisez Blade, vous pouvez essayer une boucle foreach étendue:

($item->attributes['NAME'] !== null) ? $item->attributes['NAME'] : '';

Cela suppose que vous avez déjà accès aux attributs de chaque modèle individuel, tels que $ item-> email ou dans ce cas $ item-> attributs . Si vous en avez besoin, vous pouvez utiliser @foreach ($ item-> attributes as $ key => $ value) pour le démarrer.


Si vous êtes seulement Si vous cherchez à afficher une valeur spécifique, utilisez l'opérateur null-coalesce ??.

// the fallback does not have to be a string
$person = Person::find($id) ?? Person::first();

// it can be chained
$value = $parameter ?? $localDefault ?? $globalDefault;

Vous pouvez utiliser ceci dans votre logique ailleurs avec n'importe quelle expression qui peut être nul:

$item->attributes['NAME'] ?? ''

Si le NOM n'est pas trouvé, il reviendra à ce qui vient après le ?? , qui est une chaîne vide dans l'exemple ci-dessus. C'est une bonne astuce pour éviter toute erreur si l'attribut n'existe pas. Il fait la même chose qu'un ternaire vérifiant s'il est nul:

@foreach($attributes as $key => $value)
    {{ $key }}: {{ $value }}
@endforeach

C'est évidemment compliqué, donc l'opérateur null-coalesce est pratique!


2 commentaires

Ok merci, mais avec cette boucle foreach, tous les attributs sont affichés et je souhaite afficher uniquement NAME. if ($ key == "NAME") {echo $ value; } cette méthode est-elle suffisante? Ou existe-t-il un autre moyen sans utiliser une condition if?


@yagrasdemonde, voir ma modification concernant l'opérateur null-coalesce. Oubliez la boucle foreach et accédez-y directement à l'aide de l'exemple.



0
votes

D'accord, @GoogleMac m'a mis sur la bonne voie. En fait, l'attribut NAME n'étant pas toujours présent, je dois tester la variable avec une fonction

    {{ isset($attributes->NOM) ? $attributes->NAME : 'NC' }}

et non

    !== NULL

Avec

    isset()

Le code fonctionne très bien.

Merci @GoogleMac et @Davit


0 commentaires