在 Laravel 中构建查询表达式时需要帮助

Posted

技术标签:

【中文标题】在 Laravel 中构建查询表达式时需要帮助【英文标题】:Need Help in Building a Query Expression in Laravel 【发布时间】:2020-05-31 14:29:03 【问题描述】:

我最近开始使用 Laravel,但遇到了一个查询问题。我正在开发一个任务应用程序,用户可以在其中完成管理员发布的不同任务。

我只想获取登录用户未完成的那些任务。当用户完成一项任务时,我有第三张表已完成任务,其中存储了 user_id 和 task_id。

这就是我的表格的样子:

用户表(由 Laravel auth 创建的默认表) 属性:id,name,email,password

任务表 属性:id,name,description

Completed_task 表 属性:id、user_id、task_id

我尝试使用 completed_task 表作为支点来使用用户和任务之间的 belongsToMany 关系

用户模型中的关系函数

public function tasks()
    return $this->belongsToMany('App\Task', 'completed_task', 'user_id','task_id');

通过使用此功能,我得到了登录用户完成的所有任务,但我想得到登录用户未完成的任务。

【问题讨论】:

【参考方案1】:

请试试这个:

$tasks = Tasks::whereNotIn('id', function($query) 
        $query->select('task_id')
        ->from('completed_task')
        ->where('user_id', '=', auth()->user()->id);
)->get();

这应该为您提供登录用户尚未完成的所有任务(请检查表格和字段名称)

【讨论】:

【参考方案2】:

所有模型函数如下所示:

用户.php

// A user has many tasks
public function tasks()
  return $this->hasMany(Task::class);

Task.php

// A Task belongs to User
public function users()
  return $this->belongsTo(User::class);


// A task has a completed status
public function completed()
  return $this->hasOne(Completed::class);

Completed.php

// A Completed status belongs to a Task
public function tasks()
  return $this->belongsTo(Task::class);

【讨论】:

谢谢,Talha 的回答,但第一个解决了我的问题

以上是关于在 Laravel 中构建查询表达式时需要帮助的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 查询构建器:如何访问 JSON 键/值对

以任何顺序匹配查询中的所有单词的正则表达式

使用 Laravel db builder 在查询中执行 WITH MySQL 表达式

Laravel 请求验证正则表达式,不需要

动态构建Lambda表达式实现EF动态查询

Laravel Eloquent 在子查询中有两个“WHERE NOT IN”