La confusion entre tableau et les objets dans Laravel
Je suis en train d'apprendre Laravel et il utilise OUPS concepts. Maintenant j'ai du mal à comprendre la différence entre un tableau et des objets. Je sais ce qu'est un tableau et objet.
Tableau peut détenir plus d'une variable à un endroit où un objet est une entité indépendante qui a ses propres arguments et des méthodes. Nous utilisons habituellement la boucle foreach pour parcourir en boucle.
Dans laravel, les données sont renvoyées sous la forme d'une instance du modèle d'objet. Lorsque la réponse à la requête a plusieurs résultats, puis les données sont renvoyées sous la forme d'un tableau qui contient des objets. J'essayais de comprendre la Collecte de Classe utilisé dans laravel.
Codebright de référence dit
La Collection de la classe elle-même, n'est qu'un wrapper pour un tableau d'objets, mais a un tas d'autres méthodes intéressantes pour vous aider à arracher les éléments de la matrice.
Maintenant revenir à ma confusion. J'ai été en utilisant différentes méthodes comme l' all()
et first()
des méthodes pour récupérer le résultat. Mais parfois, quand j'ai utilisé de la flèche (->
) afin d'extraire les données à l'aide d'une boucle foreach, à partir d'un objet (contenues dans un tableau), il a fait une erreur qui dit quelque chose comme elle est un non-objet. Ensuite, j'ai utilisé les crochets et les données ont été affichées.
Je sais que nous utilisons []
pour récupérer des données à partir de baies et nous utilisons ->
pour récupérer des données à partir d'objets. Mais je suis toujours confus au sujet de Laravel. Quelqu'un peut-il indiquer clairement la différence entre eux, en référence à la Collection de classe utilisé dans Laravel?
Edit:: La confusion a commencé tout en utilisant ce code:
foreach($self_conversations as $self_conversations_fetch){
//fetching each conversation id
$conversation_id = Conversation::find($self_conversations_fetch->conversation_id);
$user_id = array();
//fetching each conversation member's id
foreach($conversation_id->conversationsMember as $conversationmembers)
$user_id[] = $conversationmembers->user_id;
$self_id = User::where('email', Session::get('email'))->first()->id;
$self_id_array = array($self_id);
$friend_id_array = array_diff($user_id, $self_id_array);
foreach($friend_id_array as $friend_id) array_push($friend_ids, $friend_id);
$conversations_reply_obj = ConversationReply::where('conversation_id', $self_conversations_fetch->conversation_id)->orderBy('updated_at', 'desc')->first();
$conversations_reply[] = $conversations_reply_obj['reply'];
}
Comme vous pouvez le voir, j'ai utilisé des crochets pour récupérer les données(dans la dernière ligne).
$conversations_reply[] = $conversations_reply_obj['reply'];
je m'attendais à flèche de travailler ici
OriginalL'auteur Kanav | 2014-04-06
Vous devez vous connecter pour publier un commentaire.
Fait le
Collection
classe est un objet wrapper qui retourne une collection d'objets. Par exemple, si vous avez un Modèle par exemple,User
alors vous pouvez l'utiliser de différentes manières, pour obtenir tous les enregistrements, vous pouvez utiliserUser::all()
et de n'obtenir qu'un seul dossier, vous pouvez utiliserUser::find(1)
et il y a d'autres façons.Si vous utilisez
all()
,get()
méthodes, alors vous obtiendrez un objet de collection, il signifie une collection deUser
modèles lorsque vous utilisez ces méthodes surUser
modèle et n'oubliez pasall()
etget()
retourne toujours une collection de modèles, même si il n'y a qu'un seul modèle, afin de vérifier cette examaple:Vous pouvez utiliser
first()
méthode deCollection
objet comme ceci:Ou directement juste:
Vous pouvez également utiliser
last
pour obtenir le dernier élément/modèle de la collection. Vous pouvez également utiliserget()
comme ceci:Vous pouvez également utiliser une boucle comme ceci:
Maintenant dans votre
views/users/index.blade.php
point de vue, vous pouvez utiliser une boucle comme ceci:Il est important de knoe que,
all()
etget()
méthodes renvoie une collection etfirst()
etfind(id)
renvoie à un modèle unique de l'objet, donc si vous avez un modèle unique, alors vous pouvez l'utiliser directement comme ceci:Dans votre vue, vous pouvez utiliser:
{{ $user->email }}
Vous pouvez utiliser un objet à l'aide de
->
par exemple$user->name
et un tableau à l'aide$user['name']
mais dans ce cas vous pouvez utiliser à la fois la syntaxe parce queLaravel
'sEloquent/Model
implémenteArrayAccess
(avec d'autres) de l'interface afin que chaque modèle qui s'étendEloquent
pourrait être utilisé à l'aide de tableau et l'objet de la syntaxe pour accéder à des propriétés. Ainsi, en suivant est possible:Dans le
view
vous pouvez utiliser:Pour une meilleure compréhension de la
Collection
de classe et de méthodes de vérifier le code source, vous pouvez le trouver àvendor/laravel/framework/src/Illuminate/Database/Eloquent/Collection.php
de votre installation locale et il s'étendIlluminate/Support/Collection.php
classe. Vérifiez les deux classes. Vous pouvez également lire cet article, ça va vous aider plus.OriginalL'auteur The Alpha
Je pense connaître la source de votre problème, j'ai eu à travailler autour d'elle. Si vous êtes à l'aide de la flèche de notation dans un modèle objet et il n'y a pas d'enregistrement dans la relation, vous obtiendrez alors le "non-objet" d'erreur. Par exemple, si vous avez la ligne
et un
$student
n'ont pas deschool
objet, vous obtiendrez l'erreur non objet. En général, je ajouter des contrôles pourempty($student->school)
ouempty($student->school_id)
ou pour éviter cela quand je le lance (ou à dieu ne plaise entrevoir le problème en faisant mes premiers codage de passe).EDIT: Donc, pour clarifier, Laravel ne veut pas dire "oh, il y a là une relation, donc
school
est un objet qui se trouve être vide, donc je vais retourner la valeur null pourschool_name
", il est dit "il n'y a passchool
, donc->school_name
est pas valide appel à une propriété de l'objet"OriginalL'auteur dspitzle