一尘不染

Laravel检查相关模型是否存在

php

我有一个口才的模型,其中有一个相关的模型:

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>我要查找的代码在哪里。


阅读 399

收藏
2020-05-26

共1个答案

一尘不染

php 7.2+中, 您不能count在关系对象上使用,因此对于所有关系都没有一种万能的方法。使用查询方法代替@tremby,如下所示:

$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
2020-05-26