Laravel - на какой модели я должен определить сводную таблицу? - PullRequest
1 голос
/ 10 января 2020

Позвольте мне показать здесь сценарий из Laravel do c: соответствующие таблицы базы данных: users, roles и role_users. Имена таблиц не требуют пояснений.

User модель:

class User extends Model
{
    /**
     * The roles that belong to the user.
     */
    public function roles()
    {
        return $this->belongsToMany('App\Role');
    }
}

В do c говорится:

Как упоминалось ранее, определив имя таблицы объединяющей таблицы отношений, Eloquent объединит два связанных имени модели в алфавитном порядке. Тем не менее, вы можете изменить это соглашение. Вы можете сделать это, передав второй аргумент в метод ownToMany:

return $this->belongsToMany('App\Role', 'role_user');

Затем он определяет обратную зависимость:

Role модель:

class Role extends Model
{
    /**
     * The users that belong to the role.
     */
    public function users()
    {
        return $this->belongsToMany('App\User');
    }
}

Затем он говорит:

Поскольку мы повторно используем метод ownToMany, все обычные параметры настройки таблицы и ключа доступны при определении обратного отношения «многие ко многим».

Что я понимаю до сих пор:

Таблица pivot была определена в User модели, и в документах говорится, что
все обычные параметры таблицы и настройки ключа доступны в модели Role с обратным отношением многие-ко-многим.

Так что, кажется, есть также возможность определить сводную таблицу в Role модель также.

Eloquent объединит два связанных имени модели в алфавитном порядке, чтобы определить имя сводной таблицы по умолчанию.

В какой модели следует определить сводную таблицу, если имя сводной таблицы не соответствует соглашение по умолчанию?

Ответы [ 3 ]

0 голосов
/ 10 января 2020

Определите их на обоих. И User, и Role используют отношение belongsToMany(), которое указывает отношение многие ко многим.

Функция выглядит следующим образом:

public function belongsToMany($related, $table = null, $foreignPivotKey = null, $relatedPivotKey = null,
                                  $parentKey = null, $relatedKey = null, $relation = null)

, поэтому

$this->belongsToMany(User::class, 'role_user');
// and
$this->belongsToMany(Role::class, 'role_user');

Таким образом, вы можете просто определить параметр $table в обоих отношениях. По моему мнению, это также лучший способ сделать это, так как это волшебное угадывание имени таблицы может вызвать путаницу.

0 голосов
/ 10 января 2020

Попробуйте переключить красноречивую связь в моделях таким способом. Но, прежде всего, убедитесь, что вы используете модели, т.е.


/**
* On the User model
*/
use App\Role;

public function roles()
{
    return  $this->belongsToMany(Role::class, 'role_users', 'user_id', 'role_id')->withTimestamps();
}

/** where user_id is the primary key in the table referencing the User model and the role_id is the equivalent in the Referenced/Foreign table. 
**[I know you understand what I mean here.]** -- Same thing applies to the code in the Role Model
 **/



/**
* On the roles model
*/

use App\User;

public function users()
{
    return  $this->HasMany(User::class, 'role_users', 'role_id', 'user_id')->withTimestamps();
}`

Надеюсь, я не ошибся в вашем вопросе.

0 голосов
/ 10 января 2020
/**
* On the User model
*/
public function roles()
{
    return  $this->belongsToMany('App\Role', 'role_users', 'user_id', 'role_id')->withTimestamps();
}


/**
* On the roles model
*/
public function users()
{
    return  $this->belongsToMany('App\Role', 'role_users', 'role_id', 'user_id')->withTimestamps();
}

Где role_users - сводная таблица, а первый аргумент - foreignPivotKey, второй аргумент - relatedPivotKey

Таким образом, у вас есть полное отношение к обеим моделям. Вы можете получить доступ все роли пользователей и наоборот

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...