为什么Laravel在加载数据时有时会使用单数数据库表名



我正在进行一个Laravel项目,该项目使用多个具有多个数据库名称的模型。在本例中,模型:

class RedCar extends Model

由表支持:

red_cars

我有另一个叫Dog的模型,它有一种belongToMany关系:

class Dog extends Model
{
public function red_cars()
{
return $this->belongsToMany(RedCar::class)
->select( array('name','description') );
}

有一个数据透视表

dog_red_car

当我访问一个加载了几个RedCar项目的页面(使用->load((函数(时,我会得到以下错误:

SQLSTATE[42S02]:找不到基表或视图:1146表"my_database.red_car"不存在(SQL:从name0内部选择CCD_1、versiondescriptiondog_red_car.dog_id作为pivot_dog_iddog_red_car.red_car_id作为pivot_red_car_id加入red_car上的red_carid=dog_red_car.red_car_id,其中dog_red_car.dog_id在(1024(中(

请注意所有red_car表名都是单数。我不确定是什么原因导致拉拉维尔将该表称为单数。该模型目前没有protected $table变量,因此Laravel应该默认为复数版本。我已经搜索了整个项目,找不到任何(显然(引用名为red_car的数据库表的代码。此外,我在任何地方都找不到"单数"这个词。迁移显示了一个复数名称:

Schema::create('red_cars', function (Blueprint $table) {

代码中还有其他几个地方使用了表名的复数形式。是什么让Laravel使用这个表名的单数形式?该项目还有其他几个belongToMany关系,但似乎只有一个存在此问题。我设法添加了一个快速修复程序,通过在模型中添加$table来纠正错误:

protected $table = 'red_cars';

显然,这迫使Laravel使用red_cars(这是正确的复数形式(,页面加载时不会出错。然而,我担心有一个神秘的设置会在以后引起单数-复数数据库问题。

有时它只是发生而已。最好在你的模型中添加一个默认的表名,这样Laravel就不会犯这个错误。

Laravel,是一个非常简单的框架,希望具有包容性;尝试在其中添加许多功能,以使使用它的开发人员的工作更轻松。它的一种方法是通过手工命令,这些命令在几秒钟内完成了大量的脚手架工作,并消除了对艰苦的文件名协调和管理的需要。

Laravel遵循严格的命名惯例,你可以在这里阅读https://webdevetc.com/blog/laravel-naming-conventions

你运行了吗

PHP artisan make:model RedCar -a

命令?

-a标记会自动为该模型创建"所有"必要的文件;迁移、播种机和控制器。

您也可以阅读Laravel文档中的其他标签。当遵循命名约定时,就不需要使用显式地指向表

protected $table = 'red_cars';

希望我能帮你。

最新更新