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属性返回ModelCollection 。 两者都实现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 ,所以至lessbelongsTohasOnehasManybelongsToMany

我更喜欢使用exists方法:

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

检查相关模型是否存在。 它在Laravel 5.2上工作正常

不知道这是否在Laravel 5中发生了变化,但是使用count($data->$relation)接受的答案对我来说不起作用,因为访问关系属性的行为导致它被加载。

最后,一个简单的isset($data->$relation)为我做了窍门。

您可以在模型对象上使用relationLoaded方法。 这节省了我的培根,希望它可以帮助别人。 当我问Laracasts同样的问题时,我被给了这个build议 。