我有一个雄辩的模型,它有一个相关的模型:
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());
}
};
其中
在PHP7.2中,不能对关系对象使用count
,因此没有适合所有关系的方法。请使用下面提供的@tremby查询方法:
$model->relation()->exists()
适用于所有关系类型的通用解决方案(PHP 7.2前版本):
if (count($model->relation))
{
// exists
}
这将适用于每个关系,因为动态属性返回Model
或Collection
。两者都实现ArrayAccess
。
所以它是这样的:
单一关系:hasOne
/属于
// 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
对于许多关系:有许多
/属于多个
/变形多个
/变形多个
/变形多个
// 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
关系对象将未知方法调用传递给雄辩的查询生成器,该查询生成器设置为仅选择相关对象。该生成器依次将未知方法调用传递给其底层查询生成器。
这意味着您可以直接从关系对象中使用存在()
或计数()
方法:
$model->relation()->exists(); // bool: true if there is at least one row
$model->relation()->count(); // int: number of related rows
注意关系后的括号:
-
对关系对象使用count
方法(即使用括号)将比使用$model快得多-
exists()
和count()
都适用于我尝试过的所有关系类型,因此至少属于
,有一个
,有多个
,以及属于
。
我更喜欢使用exists
方法:
修复项目::find($id)-
检查相关模型是否存在。它在Laravel 5.2上运行良好