Php 两种模型的雄辩查询
我需要你的帮助,求你了! 我有两种型号Php 两种模型的雄辩查询,php,laravel,eloquent,Php,Laravel,Eloquent,我需要你的帮助,求你了! 我有两种型号客户和会员。客户拥有许多会员资格。 我需要提取所有会员资格处于活动状态的客户。我这样做了,但它只提取会员资格,没有客户数据。如何更改它以解决问题 Membership::has("customer") ->forCompany($companyId) ->whereIn('state', ['ATTIVA', 'IN ATTESA DI ESITO', 'DA INVIARE']) ->where(function
客户
和会员
。客户拥有许多会员资格。
我需要提取所有会员资格处于活动状态的客户。我这样做了,但它只提取会员资格,没有客户数据。如何更改它以解决问题
Membership::has("customer")
->forCompany($companyId)
->whereIn('state', ['ATTIVA', 'IN ATTESA DI ESITO', 'DA INVIARE'])
->where(function ($query) {
$query
->where('end_date', '>=', Carbon::now()->toDateString())
->orWhereNull('end_date');
})
您希望拉取客户并检查其活动会员资格。相反,您的查询首先调用成员资格。您的查询应该是:
Customer::whereHas('memberships', function ($query) use ($companyId){
$query
->forCompany($companyId)
->whereIn('state', ['ATTIVA', 'IN ATTESA DI ESITO', 'DA INVIARE'])
->where(function ($sub_query) {
$sub_query
->where('end_date', '>=', Carbon::now()->toDateString())
->orWhereNull('end_date');
});
})
->with(['memberships'])
->get();
在上面的代码中,“成员身份”是客户模型中的关系定义。类似如下:
public function memberships() {
return $this->hasMany('App\Membership');
}
您希望拉取客户并检查其活动会员资格。相反,您的查询首先调用成员资格。您的查询应该是:
Customer::whereHas('memberships', function ($query) use ($companyId){
$query
->forCompany($companyId)
->whereIn('state', ['ATTIVA', 'IN ATTESA DI ESITO', 'DA INVIARE'])
->where(function ($sub_query) {
$sub_query
->where('end_date', '>=', Carbon::now()->toDateString())
->orWhereNull('end_date');
});
})
->with(['memberships'])
->get();
在上面的代码中,“成员身份”是客户模型中的关系定义。类似如下:
public function memberships() {
return $this->hasMany('App\Membership');
}
如果希望客户
数据具有成员资格,则必须从客户
模型而不是成员
模型编写查询。如果您希望使用客户数据加载成员资格,则必须使用with()
方法
下面是您想要的查询:
$customers = Customer::whereHas("memberships",function($q) use ($companyId){
return $q->forCompany($companyId)
->whereIn('state', ['ATTIVA', 'IN ATTESA DI ESITO', 'DA INVIARE'])
->where(function ($query) {
$query->where('end_date', '>=', Carbon::now()->toDateString())
->orWhereNull('end_date');
});
})->with('memberships')->get();
因此,您可以访问每个客户的会员资格,如下所示:
foreach($customers as $customer)
$memberships = $customer->memberships;
注意:不要忘记在Customer
model中定义membersips()方法。请记住使用->with()
方法使用客户数据快速加载成员身份。不要忘记在查询结束时使用->get()
您可以阅读有关即时加载的信息。如果您希望客户
数据具有会员资格,则必须从客户
模型而不是会员
模型编写查询。如果您希望使用客户数据加载成员资格,则必须使用with()
方法
下面是您想要的查询:
$customers = Customer::whereHas("memberships",function($q) use ($companyId){
return $q->forCompany($companyId)
->whereIn('state', ['ATTIVA', 'IN ATTESA DI ESITO', 'DA INVIARE'])
->where(function ($query) {
$query->where('end_date', '>=', Carbon::now()->toDateString())
->orWhereNull('end_date');
});
})->with('memberships')->get();
因此,您可以访问每个客户的会员资格,如下所示:
foreach($customers as $customer)
$memberships = $customer->memberships;
注意:不要忘记在Customer
model中定义membersips()方法。请记住使用->with()
方法使用客户数据快速加载成员身份。不要忘记在查询结束时使用->get()
您可以阅读有关即时加载的信息。您错过了一个->get()
在那里?您错过了一个->get()
在那里?生成的查询是这样的:从客户那里选择*(从memberships
中选择*,其中customers
id
customer\u id
和company\u id
=?和state
in(?,?)和(end\u date
或end\u date
为空)和memberships
成员身份在处删除的为空)和客户
已删除\u在
处为空,并且没有“会员资格”数据….@Swim89会员资格数据位于客户集合的关系属性下。如果使用dd()您可以在“关系”下找到客户集合property@Swim89如果你像我解释的那样获得会员资格,它将立即出现。buy read docs了解有关with()方法和即时加载的更多信息生成的查询如下:选择*fromcustomers
where exists(从memberships
中选择*,其中customers
id
customer\u id
和company\u id
=?和state
in(?,?)和(end\u date
或end\u date
为空)和memberships
成员身份在处删除的为空)和客户
已删除\u在
处为空,并且没有“会员资格”数据….@Swim89会员资格数据位于客户集合的关系属性下。如果使用dd()您可以在“关系”下找到客户集合property@Swim89如果你像我解释的那样获得会员资格,它将立即出现。购买read docs以获取有关with()方法和即时加载的更多信息