Laravel Eloquent 检索包含空字段的记录关系

问题描述

我正在尝试获取具有关系的空字段的记录。我的交易模式就是这样。

<?PHP

namespace App\Models;

class Deal extends Model
{
use HasFactory;
use SoftDeletes;

protected $fillable = [
    'id','creator_user_id','user_id','owner_name','person_id','person_name','stage_id','title','value','currency','formatted_value','status','won_time','note','source','gender','nationality','city','language','passport_number','arrival_airport','arrival_flight_code','arrival_date','arrival_time','hotel','hotel_nights','hotel_check_in_date','hotel_check_out_date','departure_airport','departure_flight_code','departure_date','departure_time','discount'
];

public function person()
{
    return $this->hasOne('App\Models\Person','id','person_id');
}

/**
 * Scope a query to all fields not filled.
 *
 * @param  \Illuminate\Database\Eloquent\Builder  $query
 * @return \Illuminate\Database\Eloquent\Builder
 */
public function scopeNotFilled($query): \Illuminate\Database\Eloquent\Builder
{
    return $query
        ->orWhereNull('source')
        ->orWhereNull('gender')
        ->orWhereNull('nationality')
        ->orWhereNull('city')
        ->orWhereNull('language')
        ->orWhereNull('arrival_airport')
        ->orWhereNull('arrival_flight_code')
        ->orWhereNull('arrival_date')
        ->orWhereNull('arrival_time')
        ->orWhereNull('hotel')
        ->orWhereNull('hotel_nights')
        ->orWhereNull('hotel_check_in_date')
        ->orWhereNull('hotel_check_out_date')
        ->orWhereNull('departure_airport')
        ->orWhereNull('departure_flight_code')
        ->orWhereNull('departure_date')
        ->orWhereNull('departure_time')
        ;
   }
}

当我尝试使用下面的查询获取数据时

         return Deal::notFilled()->
         whereHas('person',function ($query){
            $query->orWhere('email',null);
         })
        ->where('won_time','>',Carbon::parse('2021-01-01'))
        ->orderBy('won_time','desc')
        ->paginate(15);

我可以获得包含一些空字段的交易,但不包括没有 email 的关系。我想获得具有空字段的交易,并且如果关系没有 email 地址必须在列表中。我该如何解决这个问题?

解决方法

我已经通过这样的加入解决了我的问题;

    return Deal::where('won_time','>',Carbon::parse('2021-01-01'))->
    join('people','people.id','=','deals.person_id')->
    where(function($q){
       $q->notFilled()
       ->orWhereNull('people.email');
    })->
    orderBy('won_time','desc')->
    select('deals.*')->
    paginate(15);

如果有任何有效的方法来解决这个问题,我可以听到你的解决方案。