My versions are:
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!
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);
}
}