Laravel: Как получить записи с помощью сводной таблицы? - PullRequest
0 голосов
/ 25 ноября 2018

У меня много-много отношений между задачей и пользователями, я пытаюсь получить заархивированные задачи, заархивированная задача:

  • Задача, которая is_done = 1
  • Задача, которая была выполнена вчера или раньше, не включая задачи, завершенные сегодня

  • Пользователь может видеть только те архивные задачи, которые он создал или ему назначены, если пользователь назначен назадача, его идентификатор хранится в сводной таблице

  • По причинам, выходящим за рамки вопроса, я могу получить доступ к пользователям только с помощью сводной таблицы, как показано в 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());
    }
}

Фактические таблицы соответственно

enter image description here

и

enter image description here

Мой код:

Помощник ниже

    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]);
}

Я просто получаю статус ОК, результата нет,массив задачявляется нулевым, хотя мой код кажется правильным, и таблицы содержат 1 запись, которая должна была быть возвращена.

1 Ответ

0 голосов
/ 02 декабря 2018

В вашем методе getArchived отсутствует оператор возврата.Кроме того, условие orWhere кажется неуместным.Вы должны использовать группирование параметров , если вам необходимо применить первые три условия.В противном случае запрос читает (1 && 2 && 3 && 4) || 5, тогда как вам нужно 1 && 2 && 3 && (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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...