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

Я использую Lumen 5.1, у меня много-много отношений между задачами и пользователями

Модель задач

public function user()
{
    return $this->belongsToMany('App\Models\Auth\User', 'task_user');
}

public function domain()
{
    return $this->hasOne('App\Models\Domain', 'domain_id');
}

Модель пользователя

public function tasks()
{
    return $this->belongsToMany(Task::class, 'task_user');
}

Модель UserTask

class UserTask {}

Я хочу найти пользователя задачи, мой код

$tasks = Task::Where(function ($query) use ($domainId) {
    $query->where("domain_id", $domainId)
        ->where("is_done", 0)
        ->orwherehas('tasks.user.id', \Auth::id)
        ->orderBy('due_date', 'DESC');
})
->orWhere(function ($query) use ($domainId) {
    $query->where("domain_id", $domainId)
        ->Where("is_done", 1)
        ->Where("closed_dated", Carbon::today())
        ->orwherehas('tasks.user.id', \Auth::id)
        ->orderBy('closed_date', 'ASC');
})
->get();

Мой вопрос whereHas правильный?tasks.user.id правильно?Могу ли я получить идентификатор пользователя таким образом?Я сделал это таким образом, потому что этот вопрос

Технический руководитель говорит мне, что мой код неверен, он будет использовать where, он сказал, что whereHas, когда вы хотитезапустить закрытие.

Миграции:

Задачи

public function up()
{
    Schema::create($this->getTable(), function (Blueprint $table) {
        $table->increments('id');
        $table->string('title')->nullable();
        $table->dateTime('submit_date');
        $table->dateTime('closed_date');
        $table->dateTime('due_date');
        $table->tinyInteger('is_done')->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());
}

task_user

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

}

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

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Нет, whereHas не будет правильным для обоих здесь.Кроме того, вы не скажете whereHas('tasks...') на модели Task.

NB

2-й параметр для whereHas должен быть замыканием (функцией), а Auth::id должен быть Auth::id().Вы также можете использовать вспомогательную функцию auth() вместо фасада Auth, если хотите.

Следующее должно дать вам то, что вы хотите:

$tasks = Task::where("domain_id", $domainId)
    ->where(function ($query) use ($domainId) {
        $query
            ->where("is_done", 0)

            //whereHas - 1st arg = name of the relationship on the model, 2nd arg = closure
            ->whereHas('user', function ($query) {
                $query->where('id', auth()->id());
            });
    })
    ->orWhere(function ($query) use ($domainId) {
        $query
            //If "is_done" = 1 only when it's been closed then you won't need to check "is_done"
            ->where("is_done", 1)
            ->where('closed_by', auth()->id())
            ->whereDate("closed_dated", '>=', Carbon::today()->startOfDay());
    })
    ->orderBy('due_date', 'DESC')
    ->orderBy('closed_date', 'ASC')
    ->get();
0 голосов
/ 23 ноября 2018

В следующем сообщении в блоге описан пример назначения задачи один-ко-многим.

https://medium.com/@brice_hartmann/building-a-user-based-task-list-application-in-laravel-eff4a07e2688

Получение заданий для текущего пользователя. Отношение отношение к элементу ToTany к модели пользователя будет следующим:

Auth::user()->tasks()->where('is_done',0) .... ->get();

Получение заданий с пользователями:

Tasks::with(['user'])->where('is_done',1) ... ->get();

Заключение аутентифицированного пользователя ... Я не уверен на 100%, что это правильно:

Auth::user()->tasks()
    ->where('domain_id', $domainId)
    ->where(function ($query) {
        $query->where('is_done', 1)
              ->orWhere(function($query) {
                 $query->where('is_done', 0)
                       ->where('closed_dated', Carbon::today())
            });
        });
    })
    ->get();
...