Holen Sie sich Laravel-Modelle mit allen Attributen

Lesezeit: 5 Minuten

Gibt es eine Möglichkeit, ein Modell in Laravel mit allen Attributen abzurufen, auch wenn sie null sind? Es scheint nur ein Modell mit den Attributen zurückzugeben, die nicht null sind.

Der Grund dafür ist, dass ich eine Funktion habe, die die Modellattribute aus einem Array aktualisiert, wenn die Attribute im Modell vorhanden sind. Ich verwende die Funktion property_exists(), um das Modell zu überprüfen, ob es ein bestimmtes Attribut hat, bevor ich es setze. Es wird erwartet, dass der Array-Schlüssel und das Modellattribut übereinstimmen, also funktioniert es so.

Es funktioniert gut, wenn das Modell bereits die Attribute festgelegt hat, da das Attribut vorhanden ist und den Wert aus dem Array übernimmt. Aber es wird nichts aktualisiert oder gesetzt, wenn das Attribut zuvor null war, weil es die property_exists()-Prüfung nicht besteht.

Letztendlich habe ich ein einzelnes Array von Attributen und dann vielleicht zwei Modelle. Und ich führe meine Setter-Funktion aus und übergebe das Attribute-Array und jedes der Objekte in separaten Aufrufen. Wenn das Modell eine passende Eigenschaft hat, wird es aktualisiert.

Benutzer-Avatar
Thomas Kim

Hier sind zwei Möglichkeiten, dies zu tun. Eine Methode besteht darin, Standardattributwerte in Ihrem Modell zu definieren.

protected $attributes = ['column1' => null, 'column2' => 2];

Dann können Sie die verwenden getAttributes() -Methode, um die Attribute des Modells abzurufen.

Wenn Sie jedoch keine Standardattribute festlegen möchten, habe ich eine schnelle Methode geschrieben, die funktionieren sollte.

public function getAllAttributes()
{
    $columns = $this->getFillable();
    // Another option is to get all columns for the table like so:
    // $columns = \Schema::getColumnListing($this->table);
    // but it's safer to just get the fillable fields

    $attributes = $this->getAttributes();

    foreach ($columns as $column)
    {
        if (!array_key_exists($column, $attributes))
        {
            $attributes[$column] = null;
        }
    }
    return $attributes;
}

Wenn das Attribut nicht festgelegt wurde, wird im Grunde genommen ein Nullwert an dieses Attribut angehängt und als Array an Sie zurückgegeben.

  • Wenn das Ziel darin besteht, leere Werte auf null zu setzen, wäre der einfachste Weg, sie anzuhängen ->nullable() zum Feld in der Migration. Sie müssen keine neue Methode schreiben oder im Modell festlegen. Davon abgesehen sollte keines von beiden notwendig sein

    – tam5

    4. November 2015 um 14:06 Uhr

  • Das Ziel ist, dass er alle Attribute abrufen kann, wenn sie noch nicht festgelegt sind, und die einzige Möglichkeit, dies zu tun, besteht darin, die Werte auf null (oder einen anderen Standardwert) zu setzen.

    – Thomas Kim

    4. November 2015 um 16:35 Uhr


  • Da wir keinen Code sehen können, gehe ich zumindest davon aus, dass er mit einer leeren Instanz arbeitet, da er sagt getAttributes() funktioniert nicht. Zum Beispiel so etwas wie $user = new User; $user->getAttributes(); gibt keine Attribute zurück, weil es nicht gesetzt ist.

    – Thomas Kim

    4. November 2015 um 16:44 Uhr


  • Ah, in der Tat, Sie haben recht, wenn er anruft new User; Ich werde meine Antwort aktualisieren, um sie in einem solchen Fall von Ihrer zu unterscheiden

    – tam5

    4. November 2015 um 17:15 Uhr

  • Vielen Dank! Dies führte mich in die richtige Richtung. Realistischerweise brauchte ich nicht jedes Attribut des Modells. Nur ein paar ausgewählte, die aktualisiert werden müssen, die sich zufälligerweise auch im $fillable-Array befinden, als ich darüber nachdachte. Ich kann also tatsächlich $fillable verwenden, um zu prüfen, ob das Modell das Attribut haben sollte.

    – kenshin9

    6. November 2015 um 3:17 Uhr

$model->getAttributes();

Oben gibt ein Array von Rohattributen zurück (wie in der Datenbanktabelle gespeichert).

$model->toArray() 

Oben gibt alle rohen, mutierten (falls verwendet) und angehängten Attribute des Modells zurück

Hoffe es wird hilfreich sein!!

Benutzer-Avatar
tam5

Aktualisieren:

Wenn Sie versuchen, dies nach der Instanziierung so zu tun:

$model = new Model;

dann weichen Sie bitte von Thomas Kims Antwort ab.

Ansonsten: Du könntest die verwenden toArray() oder getArributes() -Methode auf der Modellinstanz, die alle Attribute einschließlich Nullen zurückgeben würde. Dann können Sie verwenden array_key_exists überprüfen.

So:

if (array_key_exists('foo', $model->getAttributes())) {
    $model->foo = 'new value';
}

  • Ich habe versucht, ein neues Modell zu instanziieren, und wenn ich eine dieser Funktionen ausprobiere, erhalte ich ein leeres Array. Ich denke aber, dass man damit rechnen sollte. Zumindest in der Dokumentation für getAttributes () heißt es “Alle aktuellen Attribute des Modells abrufen”.

    – kenshin9

    4. November 2015 um 5:42 Uhr

  • Hast du in deinem Projekt instanziiert oder einfach nur gebastelt?

    – tam5

    4. November 2015 um 11:41 Uhr

  • Entschuldigung, ich dachte nicht daran, das zu erwähnen. Ich habe es in meinem Projekt instanziiert.

    – kenshin9

    4. November 2015 um 14:58 Uhr

  • sehr seltsam für mich, dass es funktioniert. kannst du vielleicht deinen Code posten?

    – tam5

    4. November 2015 um 15:04 Uhr

Ich habe dieses Snippet in meinem anderen Projekt, um alle Modellattribute und Beziehungen zu laden.

public function forModel($with)
{
    $this->load($with);

    $attributes = $this->toArray();

    // Normalize Null Relation To Empty Model
    foreach ($attributes as $key => $value) {
        if (
            is_null($value) && 
            method_exists($this, Str::camel($key)) && 
            $this->{Str::camel($key)}() instanceOf \Illuminate\Database\Eloquent\Relations\Relation
        ) {

            $relation = $this->{Str::camel($key)}();
            $model = $relation->getModel();
            $attributesForRelation = $model->getAttributes();
            foreach ($model->getFillable() as $column)
            {
                if (! array_key_exists($column, $attributesForRelation))
                {
                    $attributesForRelation[$column] = null;
                }
            }

            $attributes[$key] = $attributesForRelation;
        } else {
            $attributes[$key] = $value;
        }
    }

    return $attributes;
}

Was wäre, wenn Sie alle Felder, die Sie zurückhaben möchten, explizit deklarieren würden?

public function getSomeModelFromArray(Request $request)
{
    // This will only give back the columns/attributes that have data.
    // NULL values will be omitted doing it this way.
    //$model = $request->all();

    // However by declaring all the attributes I want I can get back 
    // columns even if the value is null. Additional filtering can be 
    // added on if you still want/need to massage the data.
    $model = $request->all([
        'id',
        'attr1',
        'attr2',
        'attr3',
        //...
    ]);

    //...

    return $model;
}

Ziemlich allgemeines Beispiel, aber hoffentlich findet das jemand nützlich.

Benutzer-Avatar
Gustavo Marquez

Das hat bei mir funktioniert:

$attributes = new App\Models\NameModel();
$attributes->getFillable();

1176010cookie-checkHolen Sie sich Laravel-Modelle mit allen Attributen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy