Laravel, table doesn't exist

106
21 июня 2021, 05:30

В базе данных land есть таблицы peoples и pages.
Также есть модели People и Page.
People.php

class People extends Model
{
//    protected $table = 'peoples';
}
...

Page.php

class Page extends Model
{
    //
}

В контроллере пытаюсь показать все записи через модели People и Page,
маршрут

Route::get('/', ['as'=>'home','uses'=>'IndexController@show']);

контроллер

class IndexController extends Controller
{
    public function show() {
        $pages = Page::all();
        dump($pages);
        $people = People::all();
        dump($people);
    }
}

но записи из таблицы pages нормально отображаются с помощью dump, а записи из таблицы peoples не отображаются, выдаёт ошибку:
Base table or view not found: 1146 Table 'land.people' doesn't exist (SQL: select * frompeople)

Если в модели People добавить protected $table = 'peoples'; то ошибка пропадает, но хотелось-бы понять, из-за чего ошибка, две модели практически идентичны.
Почему в модели people появляется ошибка?

Answer 1

Так происходит, потому что правила создания таблиц и моделей в laravel следующие:

Модель - ед.ч Таблица - мн.ч

Если углубиться в изучение англ языка и попытаться понять причину, то можно найти, что Page - страница (ед.ч), Pages (мн.ч) - страницы (ларавель приводит page во мн.ч) people - люди (мн.ч хотя по правилам должно быть ед.ч), а peoples - НАРОД (это не является множественным числом от слова people!). В результате laravel оставляет people так как есть так как оно уже является мн.ч! и ищет land.people в Вашей БД. Слово person (ед.ч) - people (мн.ч) <- данное преобразование является верным!

Answer 2
class People extends Model
{
//    protected $table = 'peoples';
}

По умолчанию в фреймворках предусмотрено, что если вы не указываете в экземпляре класса свойство, или метод, описывающий имя таблицы, которую использует данный класс - то автоматически берет имя таблицы равное названию класса, в вашем случае people. Из этого выходит что вы зря закомментировали строчку, т.к. она определяет с какой таблицей вам работать. Есть два варианта решения вашей проблемы:

  1. Переименовать класс People в Peoples - плохое решение, т.к. лучше задавать названия моделей и соответсвующих таблиц в единственном числе
  2. Переименовать название таблицы, вместо peoples в people

А если быть еще честнее, то People - это и есть "Люди", поэтому слова Peoples просто не существует :)

READ ALSO
Вывести слова из предложения php

Вывести слова из предложения php

Почему при выводе слов:

99
Ошибка в запросе laravel

Ошибка в запросе laravel

почему при такой выборке

102
RedBeanPHP и PHP: поиск и вывод данных

RedBeanPHP и PHP: поиск и вывод данных

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

73
Вывод записей в single.php за исключением самой записи

Вывод записей в single.php за исключением самой записи

вывожу через singlephp записи по категориям

112