php - notification - template laravel 5




Laravel vérifier si le modèle associé existe (5)

J'ai un modèle Eloquent qui a un modèle associé:

public function option() {
    return $this->hasOne('RepairOption', 'repair_item_id');
}

public function setOptionArrayAttribute($values)
{
    $this->option->update($values);
}

lorsque je crée le modèle, il n'a pas nécessairement de modèle associé. Quand je le mets à jour, je peux ajouter une option ou non.

J'ai donc besoin de vérifier si le modèle correspondant existe, soit pour le mettre à jour, soit le créer, respectivement:

$model = RepairItem::find($id);
if (Input::has('option')) {
    if (<related_model_exists>) {
        $option = new RepairOption(Input::get('option'));
        $option->repairItem()->associate($model);
        $option->save();
        $model->fill(Input::except('option');
    } else {
       $model->update(Input::all());
    }
};

<related_model_exists> est le code que je recherche.


Après Php 7.1 , la réponse acceptée ne fonctionnera pas pour tous les types de relations.

Parce qu'en fonction du type de la relation, Eloquent retournera une Collection , un Model ou un Null . Et dans Php 7.1 count(null) va jeter une error .

Donc, pour vérifier si la relation existe, vous pouvez utiliser:

Pour les relations simples: Par exemple hasOne et hasOne

if(!is_null($model->relation)) {
   ....
}

Pour les relations multiples: Par exemple: hasMany et hasMany

if ($model->relation->isNotEmpty()) {
   ....
}

Comme Hemerson Varela l'a déjà dit dans Php 7.1, count(null) va lancer une error et hasOne renvoie null si aucune ligne n'existe. Puisque vous avez une relation hasOne , j'utiliserais la méthode empty pour vérifier:

$model = RepairItem::find($id);
if (!empty($temp = $request->input('option'))) {
   $option = $model->option;

   if(empty($option)){
      $option = $user->expertise()->create();
   }

   $option->someAttribute = temp;
   $option->save();
};

Je préfère utiliser la méthode exists :

RepairItem::find($id)->option()->exists()

pour vérifier si le modèle associé existe ou non. Cela fonctionne bien sur Laravel 5.2


Un objet Relation transmet des appels de méthodes inconnus à un générateur de requêtes Eloquent , qui est configuré pour sélectionner uniquement les objets associés. À son tour, ce générateur transmet les appels de méthode inconnus à son constructeur de requête sous-jacent.

Cela signifie que vous pouvez utiliser les méthodes exists() ou count() directement à partir d'un objet relation:

$model->relation()->exists(); // bool: true if there is at least one row
$model->relation()->count(); // int: number of related rows

Notez les parenthèses après relation : ->relation() est un appel de fonction (obtention de l'objet relation), par opposition à ->relation qu'un getter de propriété magique a mis en place pour vous par Laravel (obtenir l'objet / les objets associés).

Utiliser la méthode count sur l'objet relationnel (c'est-à-dire, utiliser les parenthèses) sera beaucoup plus rapide que de faire $model->relation->count() ou count($model->relation) (sauf si la relation a déjà été désirée- chargé) car il exécute une requête de comptage plutôt que d'extraire toutes les données des objets associés de la base de données, juste pour les compter. De même, l'utilisation de l' exists n'a pas besoin de tirer des données de modèle non plus.

Both exists() et count() fonctionnent sur tous les types de relations que j'ai essayés, donc au moins hasOne , hasMany , hasMany et belongsToMany .


solution générique travaillant sur tous les types de relations (pré php 7.2):

if (count($model->relation))
{
  // exists
}

Cela fonctionnera pour toutes les relations puisque les propriétés dynamiques renvoient Model ou Collection . Les deux implémentent ArrayAccess .

Donc ça va comme ça:

relations simples: hasOne / morphTo / morphOne / morphOne

// no related model
$model->relation; // null
count($model->relation); // 0 evaluates to false

// there is one
$model->relation; // Eloquent Model
count($model->relation); // 1 evaluates to true

à-plusieurs relations: hasMany / morphMany / morphToMany / morphedByMany / morphedByMany

// no related collection
$model->relation; // Collection with 0 items evaluates to true
count($model->relation); // 0 evaluates to false

// there are related models
$model->relation; // Collection with 1 or more items, evaluates to true as well
count($model->relation); // int > 0 that evaluates to true




laravel-5