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()方法和即时加载的更多信息生成的查询如下:选择*from
customers
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()方法和即时加载的更多信息