Laravel检查相关模型是否存在
我有一个拥有相关模型的雄辩模型:
public function option() { return $this->hasOne('RepairOption', 'repair_item_id'); } public function setOptionArrayAttribute($values) { $this->option->update($values); }
当我创build模型时,并不一定有相关的模型。 当我更新它,我可能会添加一个选项,或不。
所以我需要检查相关模型是否存在,分别更新它或创build它:
$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>
是我正在寻找的代码。
好的,因为@TheShiftExchange没有接受build议,所以我们用所有关系types的通用解决scheme:
if (count($model->relation)) { // exists }
这将适用于每个关系,因为dynamic属性返回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
第一个build议的解决scheme不适用于以前的关系,因为模型上没有count()
方法,并且if ($model->relation)
对于后面的关系中的任何一个都不会计算为false,总是一个集合。 而且,即使是空的,总是评价为true
。
一个Relation对象将未知的方法调用传递给一个Eloquent查询生成器 ,它被设置为只select相关的对象。 该构build器依次将未知的方法调用传递给其基础查询构build器 。
这意味着你可以直接使用关系对象的exists()
或count()
方法:
$model->relation()->exists(); // bool: true if there is at least one row $model->relation()->count(); // int: number of related rows
注意relation
后面的括号: ->relation()
是一个函数调用(获取关系对象),而不是->relation
,这是Laravel为你创build的一个魔术属性获取器(获取相关对象/对象)。
在关系对象上使用count
方法(也就是使用括号)比使用$model->relation->count()
或count($model->relation)
要快得多(除非这个关系已经是eager-因为它运行一个计数查询,而不是从数据库中提取所有相关对象的数据,只需要对它们进行计数。 同样,使用exists
也不需要拉模型数据。
belongsTo
exists()
和count()
对我尝试过的所有关系types都belongsTo
,所以至lessbelongsTo
, hasOne
, hasMany
和belongsToMany
。
我更喜欢使用exists
方法:
RepairItem::find($id)->option()->exists()
检查相关模型是否存在。 它在Laravel 5.2上工作正常
不知道这是否在Laravel 5中发生了变化,但是使用count($data->$relation)
接受的答案对我来说不起作用,因为访问关系属性的行为导致它被加载。
最后,一个简单的isset($data->$relation)
为我做了窍门。
您可以在模型对象上使用relationLoaded方法。 这节省了我的培根,希望它可以帮助别人。 当我问Laracasts同样的问题时,我被给了这个build议 。