Verwirrt zwischen Array und Objekten in Laravel

8

Ich lerne Laravel und es benutzt OOPS-Konzepte. Jetzt fällt es mir schwer, den wirklichen Unterschied zwischen Array und Objekten zu verstehen. Ich weiß tatsächlich, was ein Array und ein Objekt ist.

Array kann mehr als eine Variable enthalten, wobei ein Objekt eine unabhängige Entität mit eigenen Argumenten und Methoden ist. Wir verwenden normalerweise foreach-Schleife, um durch sie zu durchlaufen.

In Laravel werden Daten in Form einer Modellinstanz als Objekt zurückgegeben. Wenn die Abfrageantwort mehrere Ergebnisse aufweist, werden Daten in Form eines Arrays zurückgegeben, das Objekte enthält. Ich habe versucht, die in Laravel verwendete Sammelklasse zu verstehen.

Codebright Referenz sagt

  

Die Collection-Klasse selbst ist lediglich ein Wrapper für ein Array von Objekten, hat aber eine Reihe anderer interessanter Methoden, mit denen Sie Elemente aus dem Array herauspicken können.

Jetzt komme ich zurück zu meiner Verwirrung. Ich habe verschiedene Methoden wie all() und first() Methoden verwendet, um das Ergebnis zu holen. Aber manchmal, wenn ich Pfeil ( -> ) verwendete, um die Daten mit Hilfe einer foreach-Schleife von einem Objekt (in einem Array enthalten) abzurufen, zeigte es einen Fehler, der etwas wie ein Nicht-Objekt sagt. Dann habe ich eckige Klammern verwendet und die Daten wurden angezeigt.

Ich weiß, dass wir [] verwenden, um Daten von Arrays zu holen, und wir verwenden -> , um Daten von Objekten zu holen. Aber ich bin immer noch verwirrt über Laravel. Kann jemand den Unterschied zwischen ihnen in Bezug auf die in Laravel verwendete Collection-Klasse eindeutig angeben?

Bearbeiten :: Die Verwirrung begann während der Verwendung dieses Codes:

%Vor%

Wie Sie sehen können, habe ich eckige Klammern verwendet, um die Daten (in der letzten Zeile) abzurufen.

%Vor%

Ich habe erwartet, dass der Pfeil hier funktioniert

    
Kanav 06.04.2014, 18:11
quelle

2 Antworten

17

Tatsächlich ist die Klasse Collection ein Wrapper-Objekt, das eine Sammlung von Objekten zurückgibt. Wenn Sie zum Beispiel ein Modell haben, User , dann können Sie es auf verschiedene Arten verwenden, um alle Datensätze zu erhalten, die Sie User::all() verwenden können, und um einen einzelnen Datensatz zu erhalten, können Sie User::find(1) verwenden und es gibt andere Möglichkeiten auch.

Wenn Sie die Methoden all() , get() verwenden, erhalten Sie ein Sammlungsobjekt, dh eine Sammlung von User -Modellen, wenn Sie diese Methoden für User model verwenden und all() und% co_de beibehalten % gibt immer eine Sammlung von Modellen zurück, auch wenn nur ein Modell darin enthalten ist. Überprüfen Sie dieses Beispiel:

%Vor%

Sie können get() Methode von first() Objekt wie folgt verwenden:

%Vor%

Oder direkt nur:

%Vor%

Sie können auch Collection verwenden, um das letzte Objekt / Modell aus der Sammlung zu holen. Sie können last auch so verwenden:

%Vor%

Sie können auch eine Schleife wie folgt verwenden:

%Vor%

Nun können Sie in Ihrer get() -Ansicht eine Schleife wie folgt verwenden:

%Vor%

Es ist wichtig zu wissen, dass die Methoden views/users/index.blade.php und all() eine Sammlung zurückgeben und get() und first() ein einzelnes Modellobjekt zurückgibt. Wenn Sie also ein einzelnes Modell haben, können Sie es direkt wie folgt verwenden:

%Vor%

Aus Ihrer Sicht können Sie Folgendes verwenden:

{{$ user- & gt; email}}

Sie können ein Objekt mit find(id) zum Beispiel -> und ein Array mit $user->name verwenden, aber in diesem Fall können Sie beide Syntax verwenden, weil $user['name'] s Laravel implementiert Eloquent/Model (zusammen mit anderen) ) Schnittstelle, so dass jedes Modell, das ArrayAccess erweitert, mithilfe von Array- und Objektsyntax verwendet werden kann, um auf Eigenschaften zuzugreifen. Folgendes ist möglich:

%Vor%

In Eloquent können Sie Folgendes verwenden:

%Vor%

Zum besseren Verständnis der Klasse view und ihrer Methoden überprüfen Sie den Quellcode. Sie finden ihn möglicherweise in Collection Ihrer lokalen Installation und er erweitert vendor/laravel/framework/src/Illuminate/Database/Eloquent/Collection.php class. Überprüfen Sie beide Klassen. Sie können auch diesen Artikel lesen, es wird Ihnen mehr helfen.

    
The Alpha 06.04.2014, 21:25
quelle
1

Ich denke, ich kenne die Ursache Ihres Problems, da ich es umgehen musste. Wenn Sie die Pfeilnotation für ein Modellobjekt verwenden und in der Beziehung kein Datensatz vorhanden ist, erhalten Sie den Fehler "Nicht Objekt". Zum Beispiel, wenn Sie die Zeile

haben %Vor%

und ein gegebenes $student hat kein school -Objekt, Sie erhalten den Nicht-Objekt-Fehler. Normalerweise füge ich Checks für empty($student->school) oder empty($student->school_id) oder ähnliches hinzu, um dies zu vermeiden, wenn ich darauf stoße (oder Gott bewahre das Problem, wenn ich meinen anfänglichen Codier-Durchlauf mache).

EDIT: Also, um es klarzustellen, Laravel sagt nicht "Oh, da ist eine Beziehung, also ist school ein Objekt, das zufällig leer ist, also gebe ich null für school_name ", heißt es "Es gibt keine school , daher ist ->school_name ein ungültiger Aufruf einer Objekteigenschaft"

    
dspitzle 07.04.2014 15:01
quelle

Tags und Links