使用 Yajra Datatables 从 Laravel 集合中获取 2 批关系数据

Getting 2 lots of relationship data from a Laravel collection with Yajra Datatables

我正在努力使我的 Yajra 数据表正常工作,但遇到困难。

基本上我想获得所有客户的约会,其中客户属于登录用户。然后我想访问客户名称,然后访问约会数据。我使用以下方法获取约会数据

$user = User::find(Auth::user()->id);

$data = $user->clients()->with('appointments')->get()->pluck('appointments')->flatten();

return Datatables::of($data)
    ->make(true);

这允许我为用户拥有的客户约会存在的每个约会显示一行。但是我怎样才能从中访问客户名称呢?

我尝试了很多不同的方法,但如果我使用类似

$data = $user->clients()->with('appointments')->get();

我可以访问我需要的所有数据,但它在每一行中显示现有客户,而不是客户拥有的所有约会。

我的设置是

用户模型

    public function clients(){

        return $this->hasMany(Client::class);

    }

    public function appointments()
    {
        return $this->hasManyThrough(Appointment::class, Client::class);
    }

客户端模型

   public function appointments(){

        return $this->hasMany(Appointment::class);

    }

    public function users(){

        return $this->belongsTo(User::class);

    }

预约模式

 public function client(){

        return $this->belongsTo(Client::class);

    }

谢谢

您可能正在寻找 whereHas:

$appointments = Appointment::with('client')
    ->whereHas('client.users', function ($query) use ($user) {
        $query->where('users.id', $user->id)
    })
    ->get();

这转化为:“给我所有属于特定用户的客户的约会”。

只是一个建议,将数据库结构更改为更灵活的结构可能是明智的(根本不需要)。例如,如果您在约会中跟踪哪个用户在场怎么办?

appointments
- user_id
- client_id

这会让您的查询更简单一些

// In User
public function appointments()
{
    return $this->hasMany(Appointment::class);
}

$user->appointments()->with('client')->get();

您可以更进一步,将 UserAppointmentClientAppointment 之间的关系设为多对多,这样您就可以与多个人进行约会用户 and/or 客户端。