175

関連モデルを持つ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>私が探しているコードはどこにありますか。

4

10 に答える 10

252

PHP 7.2+では、関係オブジェクトで使用できないためcount、すべての関係に万能のメソッドはありません。以下に示す @tremby の代わりにクエリ メソッドを使用します。

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

すべての関係タイプで機能する一般的なソリューション(php 7.2より前):

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

動的プロパティはModelorを返すため、これはすべてのリレーションで機能します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
于 2014-05-28T12:45:19.420 に答える
20

私はメソッドを使用することを好みますexists

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

関連モデルが存在するかどうかを確認します。Laravel 5.2で問題なく動作しています

于 2016-06-11T18:43:13.810 に答える
15

Php 7.1の後、受け入れられた回答はすべてのタイプの関係に対して機能しません。

関係のタイプに応じて、Eloquent は a Collection、 aModelまたはを返しNullます。そして、Php 7.1 count(null)ではerror.

したがって、関係が存在するかどうかを確認するには、次を使用できます。

単一の関係の場合: たとえばhasOnebelongsTo

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

複数の関係の場合: 例: hasManyandbelongsToMany

if ($model->relation->isNotEmpty()) {
   ....
}
于 2018-03-02T23:46:29.710 に答える
4

モデル オブジェクトでrelationshipLoadedメソッドを使用できます。これは私のベーコンを救ったので、他の誰かに役立つことを願っています. Laracasts で同じ質問をしたときに、この提案がありました。

于 2016-10-26T07:12:09.543 に答える
4

Hemerson Varela が Php 7.1 で既に述べたように、行が存在しない場合はcount(null)an をスローしerrorhasOne戻ります。nullあなたにはhasOne関係があるので、私はemptyメソッドを使ってチェックします:

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

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

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

しかし、これは余分です。updateまたは をcreate呼び出す必要があるかどうかを判断するために、リレーションが存在するかどうかを確認する必要はありません。updateOrCreateメソッドを使用するだけです。これは上記と同等です:

$model = RepairItem::find($id);
if (!empty($temp = $request->input('option'))) {  
   $model->option()
         ->updateOrCreate(['repair_item_id' => $model->id],
                          ['option' => $temp]);
}
于 2018-04-26T12:29:11.313 に答える
0

モデル クラスを使用し、Eloquent ORM を使用する場合は、新しいメソッドを作成して bool データを返します。お気に入り

public function hasPosts(): bool
{
    return $this->posts()->exists();
}
于 2021-08-04T13:36:06.880 に答える