0

我正在开发一个 Laravel 项目,该项目使用多个具有多个数据库名称的模型。在此示例中,模型:

class RedCar extends Model

由表支持:

red_cars

我有另一个名为 Dog 的模型,它有一个 belongsToMany 关系:

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:选择、、、、. nameas 、.as versionfrom inner join on . = . where . in ( 1024) )descriptiondog_red_cardog_idpivot_dog_iddog_red_carred_car_idpivot_red_car_iddog_red_carred_carred_cariddog_red_carred_car_iddog_red_cardog_id

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

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

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

protected $table = 'red_cars';

显然这迫使 Laravel 使用 red_cars (这是正确的复数形式)并且页面加载没有错误。但是,我怕有一个神秘的设置会导致以后出现单复数数据库问题。

4

2 回答 2

0

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

Laravel 遵循严格的命名约定,您可以在此处阅读https://webdevetc.com/blog/laravel-naming-conventions

你有没有运行

PHP artisan make:model RedCar -a

命令?

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

您还可以阅读 Laravel 文档中的其他标签。当遵循命名约定时,它消除了使用显式指向表的需要

protected $table = 'red_cars';

希望我能帮到你。

于 2020-09-28T23:01:10.643 回答
0

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

于 2020-09-29T16:48:28.540 回答