Domanda

Ho un modello 'Page' 'che ha un "PageCustomfield" di una relazione one-to-molti (come il concetto di wordpress di un campo personalizzato).

Questo modello di campo personalizzato ha due campi, chiave e valore. Quello che vorrei fare è essere in grado di fare qualcosa come il seguente in un modello di ramoscello, dove page è il modello di pagina dei genitori, custom è la raccolta di campi personalizzati e email è il tasto per interrogare relazioni sul campo L'uscita sarebbe il campo value del modello PageCustomField.

{{ page.custom.email }}
.

L'ho raggiunto aggiungendo quanto segue al modello di pagina:

public $custom = array();

public function extractCustomFields()
{
     foreach ($this->customFields as $customField) {
        $this->custom[$customField->key] = $customField->value;
     }

     return $this;
}
.

chiamato come segue:

$page = Page::where('slug', 'home')->firstOrFail()->extractCustomFields();
.

Quello che preferirei sarebbe avere un callback che ha fatto questo automaticamente, comunque, come nel metodo di avvio statico. Qualcosa come ...

public static function boot()
{
    parent::boot();

    // Extract PageCustomField relations into 'custom' array    
    static::fetched(function($model) {
        $model->extractCustomFields();
    });
}
.

Guardando attraverso i metodi di illuminazione \ database \ eloquent \ model, non sono riuscito a vedere un callback che lo raggiungerà, ma può essere fatto? Potrei scavalcare il metodo firstOrFail(), ma preferirei no.

È stato utile?

Soluzione

Credo che potresti usare un Accessor per questo caso.

protected $customFields = [
    'email' = 'foo@bar.com'
];

public function getCustomAttribute() {
    return $this->customFields; // array
    //return (object)$this->customFields; // object
}
.

Chiamalo:

$user = MyClass::find(1);

echo $user->custom['email']; // array
//echo $user->custom->email; // object
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top