我有一个与会议关联的表registration_types,一个会议可以有多种注册类型。
因此registration_types表具有以下列:id,名称,价格,conference_id。
我想查询一个特定的会议是否有价格不免费的注册类型,即价格为“> 0”。
我已经有以下会议ID:
$conference = Conference::where('id',$id)->firstOr(function(){
return redirect('/');
});
$conferenceID = $conference->id;
但是现在您知道如何知道该$ conferenceID的价格不为0的注册类型吗?
型号:
RegistrationType模型:
class RegistrationType extends Model
{
public function conference(){
return $this->belongsTo('App\Conference');
}
}
会议模型:
class Conference extends Model
{
public function registrationTypes(){
return $this->hasMany('App\RegistrationType', 'conference_id');
}
}
使用:
$paidConferences = $conference->whereHas("registrationTypes", function($query) use ($conferenceID){
$query->where('price', '>', '0');
$query->where('id', '=', $conferenceID);
})->get();
“ dd($ paidConferences);”显示会议详细信息,例如:
Collection {#331 ▼
#items: array:1 [▼
0 => Conference {#330 ▼
...
#attributes: array:22 [▼
"id" => 1
"name" => "conference test"
"description" => null
...
]
...
}
]
}
但是必需的是$ paidConferences显示与会议相关的所有注册类型的总价,因此可以执行以下操作:
@if($paidConferences >0)
<!-- show some html -->
@else
<!-- show some other html -->
@endif
答案 0 :(得分:2)
首先,对于简单的情况,您可以通过这样做来召开会议
$conference = Conference::find($id);
然后,要获取所有注册类型,这非常简单,只需查询您的registrationTypes关系。让我们开始吧:
$conference->registrationTypes()->where('price','>',0)->get();
如果您发现自己多次使用此查询,并且不想重复自己,则可以在RegistrationType模型内创建范围:
public function scopeNotFree($query)
{
return $query->where('price','>',0);
}
您的查询现在将如下所示:
$conference->registrationTypes()->notFree()->get();
这还没有结束,根据您使用此查询的频率,您的会议模型中可能还会有一个registrationTypesNotFree关系:
public function registrationTypesNotFree()
{
return $this->registrationTypes()->notFree();
}
在您的情况下,这可能有点过大,但是这没什么错。这全由您决定:)
最后,知道会议是否具有非免费注册类型将很简单
$conference->registrationTypesNotFree()->count();
或
$conference->registrationTypes()->notFree()->count();
或
$conference->registrationTypes()->where('price','>',0)->count();
这些查询都将为您返回一些非免费的相关注册类型。