Laravel:如何使用数据透视表获取记录?

Posted

技术标签:

【中文标题】Laravel:如何使用数据透视表获取记录?【英文标题】:Laravel: How to get records by using the pivot table? 【发布时间】:2019-04-27 02:30:51 【问题描述】:

我在任务和用户之间有多对多的关系,我正在尝试获取存档的任务,存档的任务是:

is_done = 1 的任务

昨天或之前完成的任务,不包括今天完成的任务

用户只能查看他创建或分配给他的归档任务 到,如果一个用户被分配到一个任务,他的 id 被存储在数据透视表中 表

由于问题范围之外的原因,我只能使用如下 Task.php 中所示的数据透视表来联系用户。

Task.php 模型

public function taskUsers()

    return $this->hasMany('App\Models\Tasks\UserTask')->where('role',1);

UserTask.php 模型不包含任何内容,一个空模型

class UserTask extends BaseModel  

迁移

class CreateTasksTable extends Migration

    protected $table = 'tasks';
    protected $app_table = true;


    public function up()
    
        Schema::create($this->getTable(), function (Blueprint $table) 
            $table->increments('id');
            $table->string('title');
            $table->dateTime('submit_date');
            $table->dateTime('closed_date')->nullable();
            $table->dateTime('due_date')->nullable();
            $table->tinyInteger('is_done')->nullable()->default(0);
            $table->integer('domain_id')->unsigned()->nullable();
            $table->foreign('domain_id')->references('id')
                ->on(self::getTableName('domains'))->onDelete('cascade');
            $table->bigInteger('created_by')->unsigned()->nullable();
            $table->foreign('created_by')->references('id')
                ->on(self::getTableName('auth_users', false))->onDelete('cascade');
            $table->bigInteger('closed_by')->unsigned()->nullable();
            $table->foreign('closed_by')->references('id')
                ->on(self::getTableName('auth_users', false))->onDelete('cascade');
            $table->timestamps();
        );

    
    public function down()
    
        Schema::drop($this->getTable());
    

class CreateTaskUsersTable extends Migration

    protected $table = 'task_user';
    protected $app_table = true;
    public function up()
    
        Schema::create($this->getTable(), function (Blueprint $table) 
            $table->increments('id');
            $table->integer('task_id')->unsigned()->nullable();
            $table->foreign('task_id')->references('id')
                ->on(self::getTableName('tasks'))
                ->onDelete('cascade');
            $table->bigInteger('user_id')->unsigned()->nullable();
            $table->foreign('user_id')->references('id')
                ->on(self::getTableName('auth_users', false))
                ->onDelete('cascade');
            $table->integer('role');
        );
    
    public function down()
    
        Schema::drop($this->getTable());
    

实际表分别

我的代码:

助手在下面

    public static function getArchived($domainId, $userId)
    
        Task::where("domain_id", $domainId)
            ->where("is_done", 1)
            ->where("closed_date", '<', Carbon::today()->startOfDay())

            ->where(function ($query) use ($userId) 
                $query->whereHas('taskUsers', function ($query) use ($userId) 
                    $query->where('user_id', $userId);
                );
            )
            ->orWhere(function ($query) use ($userId) 
                $query->where('created_by', $userId);
            )
->get();
    

行动:

public function execute()

    $domainId = $this->request->get('domain_id');
    $userId = \Auth::id();
    $tasks = TasksHelper::getArchived($domainId,$userId);
    return $this->response->statusOk(['tasks' => $tasks]);

我只是得到一个状态 OK,没有结果,tasks 数组为空,尽管我的代码似乎是正确的,并且表包含 1 条应该返回的记录。

【问题讨论】:

在你的 getArchived() 方法中,我认为你需要在 Task:: 之前放置一个 return ,所以它看起来像 return Task::where(whatever condition)-&gt;get(); 【参考方案1】:

您的 getArchived 方法中缺少 return 语句。此外,orWhere 条件似乎不合适。如果您还需要第一个三个条件来申请,则必须使用parameter grouping。否则查询读取(1 &amp;&amp; 2 &amp;&amp; 3 &amp;&amp; 4) || 5,而您需要1 &amp;&amp; 2 &amp;&amp; 3 &amp;&amp; (4 || 5)

public static function getArchived($domainId, $userId)

    return Task::where("domain_id", $domainId)
        ->where("is_done", 1)
        ->where("closed_date", '<', Carbon::today()->startOfDay())

        ->where(function ($query) use ($userId) 
            $query->whereHas('taskUsers', function ($query) use ($userId) 
                $query->where('user_id', $userId);
            )->orWhere('created_by', $userId);
        )->get();

【讨论】:

是的,谢谢,现在一切正常,根据 ***,我可以在 16 小时后奖励你赏金

以上是关于Laravel:如何使用数据透视表获取记录?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel如何通过数据透视表获取相关字段列表

Laravel belongsToMany 排除数据透视表

防止 Laravel 向数据透视表添加多条记录

如何获取已存储在另一个模型中的名称 ID,并使用名称 ID 在 laravel 的数据透视表数据库中存储值?

Laravel:如何在多态中使用wherePivot多对多

Laravel 如何创建数据透视表?