在 Laravel 中创建模型时使用受保护的 $table 变量

Posted

技术标签:

【中文标题】在 Laravel 中创建模型时使用受保护的 $table 变量【英文标题】:Using protected $table variable when creating a Model in Laravel 【发布时间】:2018-09-09 14:53:15 【问题描述】:

目前,我正在学习 Laravel 中的 Eloquent ORM,一开始,在阅读有关使用迁移表创建模型时,书中说您可以通过定义 $protected 表来更改表的名称。用所需的名称定义这个变量很容易,但很明显它不会影响 mysql 中的表。如何使用 Model 类的这个属性?

【问题讨论】:

在模型类中添加protected $table = 'the_real_table_name_in_db'; 我这样做了,但没有任何改变,这就是我问这个问题的原因。 你需要告诉模型,这个模型用的是哪个表,并不是说改变了$table也会改变db中的表名,你需要改变表的schema 因此,如果它使用预期的“snake_case”表示法创建表,我无法创建带有 --migration 标志的模型。我先用 $table 创建了一个模型,然后迁移了与 $table 相同的表名。现在它起作用了。谢谢。 【参考方案1】:

您将使用您在迁移中喜欢的名称创建表,然后您将使用:

protected $table = "mytablename";

让 Laravel 在调用 Model::create() 或任何其他方法时知道它应该使用哪个表。

【讨论】:

我先用$table创建了一个模型,然后迁移到与$table同名的表。现在它起作用了。谢谢。 很高兴它有帮助!【参考方案2】:

假设您的表格是帖子。在这种情况下,如果您创建模型 Post,laravel 会自动猜测该表是帖子。但是如果你的表名是 post,并且你将模型命名为 Post,laravel 仍然假定该表是 posts。在这种情况下你必须使用这个

protected $table = "post";

希望这可以清除您的概念。

【讨论】:

我创建了一个带有迁移标志的模型帖子,所以当我迁移表时,它在数据库中创建了一个名为“posts”的表。但是,我想重命名它,即使我写了 protected $table = "post";例如,数据库中没有任何变化。这就是为什么我认为我误解了这个变量的功能。 其实如果你创建一个模型,它不会创建表。该表是根据您的迁移文件创建的,您在那里指定的表的名称是什么。模型只会根据规则“表名是小写复数,模型名是单数,首字母大写”来计算名称。 如果这是正确答案,请不要忘记将其标记为正确答案,这样可以帮助其他有相同问题的人

以上是关于在 Laravel 中创建模型时使用受保护的 $table 变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 Laravel 尝试将其保存到数据库的情况下在 Eloquent 模型中使用受保护的属性

如何保护 Laravel 模型属性

如何使伴随对象中的变量受保护

在不允许 getEnv 调用的受保护环境中创建 AmazonHttpClient

如何使用单个工匠命令在 Laravel 8 中创建多个模型?

我们啥时候应该考虑使用私有或受保护?