1. ホーム
  2. php

[解決済み] Laravel 関連するモデルが存在するかどうかをチェックする

2022-05-06 12:27:33

質問

Eloquentのモデルで、関連するモデルを持っています。

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

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

モデルを作成したとき、必ずしも関連するモデルがあるとは限りません。更新するときに、オプションを追加することもあるし、しないこともある。

そこで、関連するモデルが存在するかどうかをチェックして、それぞれ更新するか、作成する必要があるんだ。

$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> は、私が探しているコードです。

どのように解決するのですか?

php 7.2+ を使用することはできません。 count はリレーションオブジェクトの上に置かれるので、 すべてのリレーションに対応する万能の方法はありません。そのため、すべてのリレーションに対応できる万能な方法はありません。

$model->relation()->exists()


すべてのリレーションタイプで動作する汎用的なソリューション ( php 7.2以前 ):

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

ダイナミックプロパティが返すので、これはすべてのリレーションに対して機能します。 Model または Collection . どちらも実装 ArrayAccess .

つまり、こんな感じです。

シングルリレーション hasOne / belongsTo / morphTo / 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

対多の関係。 hasMany / belongsToMany / morphMany / morphToMany / 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