train_fox
train_fox

Reputation: 1537

laravel eloquent doesn't use protected table name

In my model i added protected $table, but when i'm going to use it laravel does't use it. This is my role models:

class Role extends Model
{
    protected $table = 'role';

    protected $primaryKey = 'ROLE_ID';

    protected $casts = [
        'ACTIVE' => 'boolean',
    ];

    protected $fillable = [
        'ROLE', 'ACTIVE', 'TYPE'
    ];

    public $timestamps = false;

    public function groups()
    {
        return $this->belongsToMany(Group::class, GroupRole::class, 'ROLE_ID', 'GROUP_ID');
    }
}

And this is Group model:

class Group extends Model
{
    protected $table = 'groups';

    protected $primaryKey = 'GROUP_ID';

    protected $fillable = [
        'GROUP_ID', 'GROUP_NAME', 'PARENT_GROUP', 'ACTIVE'
    ];

    protected $casts = [
        'ACTIVE' => 'boolean',
    ];

    public $timestamps = false;

    public function type()
    {
        return $this->belongsTo(GroupType::class, 'TYPE', 'TYPE_ID');
    }

    public function roles()
    {
        return $this->belongsToMany(Role::class, GroupRole::class, 'GROUP_ID', 'ROLE_ID');
    }
}

And this is group_role table model. It handles many to many relation between role and group:

class GroupRole extends Model
{
    protected $table = 'group_role';

    protected $primaryKey = 'GROUP_ROLE_ID';

    protected $fillable = [
        'COMMENT', 'ROLE_ID', 'GROUP_ID'
    ];

    public $timestamps = false;
}

Problem begin when i want to use this models. For example:

$role = App\Role::first();
$groups = $role->groups;

Laravel returns this error messages:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'favian_mydb.App\GroupRole' doesn't exist (SQL: select groups.*, App\GroupRole.ROLE_ID as pivot_ROLE_ID, App\GroupRole.GROUP_ID as pivot_GROUP_ID from groups inner join App\GroupRole on groups.GROUP_ID = App\GroupRole.GROUP_ID where App\GroupRole.ROLE_ID = 1)

I tried to replace App\GroupRole with group_role and executing in mysql. It works fine. Am i missing something?

Upvotes: 1

Views: 25475

Answers (2)

rookian
rookian

Reputation: 1064

The Problem is in your roles relation:

public function roles()
{
    return $this->belongsToMany(Role::class, GroupRole::class,'GROUP_ID','ROLE_ID');
}

The belongsToMany expects the intermediate table name as second argument, not the class name.

So you have to define it like this:

public function roles()
{
    return $this->belongsToMany(Role::class, 'group_role','GROUP_ID','ROLE_ID');
}

Upvotes: 2

Thomas Van der Veen
Thomas Van der Veen

Reputation: 3226

I think the problem is in you relation functions. Try to use strings instead of Model::class.

Example:

return $this->return $this->belongsTo('App\GroupType', 'TYPE', 'TYPE_ID');

Hope this works.

Upvotes: 0

Related Questions