Laravel - отношение BelongsToMany игнорирует мое пользовательское (единственное) имя таблицы - PullRequest
0 голосов
/ 05 мая 2020

Я работаю над более старой (laravel 5.6) кодовой базой, в этой кодовой базе есть несколько моделей с единственными именами таблиц (не по моей задумке ..). Когда я устанавливаю новое отношение поворота между моими таблицами «m_sector» и «m_tasklist», Eloquent автоматически предполагает, что имя таблицы «m_tasklist» имеет множественное число; "m_tasklists". Я знаю, что это разработано Laravel, поэтому я использую ручное переопределение, определенное в модели Tasklist. После изменения свойства $table на «protected $ table = 'potato»; изменения были обнаружены и реализованы в запросе ..

Сообщение об ошибке

"debugMessage": "SQLSTATE[42S02]: Base table or view not found: 1146 Table 'database.m_tasklists' doesn't exist (SQL: select count(*) as aggregate from `m_tasklists` where `id` in (1, 2, 3))"

Модель списка задач

    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'm_tasklist';

    /**
     * A task list belongs to many sectors.
     *
     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
     */
    public function sector(): BelongsToMany
    {
        return $this->belongsToMany(Sector::class, 'm_sector_m_tasklist', 'm_tasklist_id', 'm_sector_id');
    }

Модель сектора

    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'm_sector';

    /**
     * A sector belongs to many task lists.
     *
     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
     */
    public function tasklists(): BelongsToMany
    {
        return $this->belongsToMany(Tasklist::class, 'm_sector_m_tasklist', 'm_sector_id', 'm_tasklist_id');
    }

Изображение имен таблиц PhpMyAdmin

table names

Может кто-нибудь, пожалуйста, помогите мне разобраться в этом, это уже день ломает мне голову.

Если кто-то хочет знать, ключевые ограничения сформированы правильно, миграции работают и настроены правильно. Могу добавить, если поможет.

1 Ответ

0 голосов
/ 06 мая 2020

Проблема была не в модели. В моем сценарии использования было правило проверки, которое проверяло, существует ли элемент в m_tasklists вместо m_tasklist

'rules' => ['exists:m_tasklists,id']

вместо правильного

'rules' => ['exists:m_tasklist,id']

Я рекомендую всем с аналогичной проблемой для запуска

$ php artisan tinker
$ (new Model)->getTable();
...