两种模式的口才查询

Swi*_*m89 1 php laravel eloquent

我需要你的帮助!我有两个模型customermembership。客户hasMany会员资格。我需要提取具有成员资格的所有客户active。我这样做了,但是它只提取成员身份,而没有客户数据。如何更改它以解决问题?

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');
    })
Run Code Online (Sandbox Code Playgroud)

Sal*_*dor 5

如果要customers获取具有成员资格的数据,则必须从Customers模型而不是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();
Run Code Online (Sandbox Code Playgroud)

因此,您可以像这样访问每个客户的成员资格:

foreach($customers as $customer)
    $memberships = $customer->memberships;
Run Code Online (Sandbox Code Playgroud)

注意:不要忘记在Customer模型中定义membersips()方法。请记住,急于使用->with()方法将客户数据加载到成员资格中。并且不要忘记->get()在查询末尾使用。

在这里,您可以了解有关急切加载的信息。