Search code examples
laravelmodellaravel-10

not working `protected $table` In the model that extends the pivot


My versions are:

  • Laravel 10.13
  • PHP 8.1

I have TeamUser model:

use App\Table;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\Pivot;
    
class TeamUser extends Pivot
{
    use HasFactory;
    
    public const USER_ID = 'user_id';
    public const TEAM_ID = 'team_id';
    
    protected $table = 'table_users';
    
    public $timestamps = false;
    
    public function user(): BelongsToMany
    {
        return $this->belongsToMany(User::class);
    }
    
    public function team(): BelongsToMany
    {
        return $this->belongsToMany(Team::class);
    }
}

I also have User model:

namespace App\Models;

use Backpack\CRUD\app\Models\Traits\CrudTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;

class Team extends Model
{
    use HasFactory;
    use CrudTrait;

    public function users(): BelongsToMany
    {
        return $this->belongsToMany(User::class)->using(TeamUser::class);
    }
}

And in migration:

return new class extends Migration
{
    public function up(): void
    {
        Schema::create(Table::TEAM_USERS, function (Blueprint $table) {
            $table->unsignedBigInteger(TeamUser::TEAM_ID);
            $table->foreign(TeamUser::TEAM_ID)->on(Table::TEAMS)->references('id')->cascadeOnDelete();
            $table->unsignedBigInteger(TeamUser::USER_ID);
            $table->foreign(TeamUser::USER_ID)->on(Table::USERS)->references('id')->cascadeOnDelete();
        });
    }

My factory:

use App\Models\Team;
use Illuminate\Database\Seeder;

class FakeDataSeeder extends Seeder
{
    public function run(): void
    {
        Team::factory()
            ->for(User::factory()->create(), TeamRelation::MANAGER)
            ->has(User::factory(), TeamRelation::USERS)
            ->create();
    }
}

I tried creating a Team with the factory's method for and has for seeding in the database, but when I run php artisan migrate:fresh --seed, it throws this error:

Illuminate\Database\QueryException 

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'crm.team_user' doesn't exist (Connection: mysql, SQL: insert into `team_user` (`user_id`, `team_id`) values (19, 4))

I defined protected $table = "team_users" in TeamUser model but it is still not working!


Solution

  • Since your namespace is not same as model, you missing the line use App\Table\TeamUser; on your User::class.

    It because your pivot model is not loaded success in User::class, so Laravel try to load the BelongsToMany relation from the default pivot table naming.

    namespace App\Models;
    
    use Backpack\CRUD\app\Models\Traits\CrudTrait;
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Database\Eloquent\Relations\BelongsToMany;
    
    use App\Table\TeamUser; // Missing this.
    
    class Team extends Model
    {
        use HasFactory;
        use CrudTrait;
    
        public function users(): BelongsToMany
        {
            return $this->belongsToMany(User::class)->using(TeamUser::class);
        }
    }