On laravel 10 site I have 3 related tables :
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
...
$table->timestamp('created_at')->useCurrent();
});
Schema::create('tasks', function (Blueprint $table) {
$table->id();
$table->foreignId('creator_id')->references('id')->on('users')->onUpdate('RESTRICT')->onDelete('CASCADE');
$table->boolean('completed')->default(false);
...
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->nullable();
});
Schema::create('task_user', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('user_id')->unsigned()->index();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreignId('task_id')->references('id')->on('tasks')->onUpdate('RESTRICT')->onDelete('CASCADE');
$table->timestamp('created_at')->useCurrent();
$table->unique(['user_id', 'task_id']);
});
I defined pivot relation in app/Models/User.php :
public function tasks(): belongsToMany {
return $this->belongsToMany(Task::class);
}
But how can I in this relation to restrict to only uncompleted tasks, where
tasks.completed = false
?
"laravel/framework": "^10.48.7",
Thanks in advance!
Error Notice :
I tried as @Ignacio Amores proposed, but got error :
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'task_user.completed' in 'where clause'
select
`tasks`.*,
`task_user`.`user_id` as `pivot_user_id`,
`task_user`.`task_id` as `pivot_task_id`
from
`tasks`
inner join `task_user` on `tasks`.`id` = `task_user`.`task_id`
where
`task_user`.`user_id` = 1
and `task_user`.`completed` = 0
as I need to apply filter on tasks.completed, but not task_user.completed, as it is rendered using wherePivot method …
I got data with code :
$this->profileUser->uncompletedTasks
and added method in User model :
public function uncompletedTasks(): belongsToMany {
return $this->belongsToMany(Task::class)->wherePivot('completed',false);
}
2
Answers
Decision is :
I´m very new to Laravel, but in the Laravel´s documentation apperas to be the wherePivot() method for cases like this:
https://laravel.com/docs/10.x/eloquent-relationships#filtering-queries-via-intermediate-table-columns
As I understand it, this could resolve the problem.