php - 创建时间戳会在构造函数中设置动态表名的模型引发错误

标签 php laravel eloquent laravel-5

我有一个带有构造函数的 Eloquent 模型(如下),它采用 $type 参数。类型是 - 假设 - firstsecondthird

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class MyModel extends Model {

    protected $table; // Define $table field

    public function __construct($type = null, array $attributes = array()) {

        // Initialize $table field
        $this->table = isset($type) ? 'my_'.$type.'_table' : null;

        parent::__construct($attributes);
    }

?>

如您在上面的代码中所见,我将模型的 $table 属性设置为 my_[type]_table,因此我可以通过以下之一动态使用模型3张 table 可用。像这样:

// Somewhere in controller
$type = 'first';
$myModel = new MyModel($type);
$myModel->create(.....); // <= Error is thrown here

问题是当 Eloquent 尝试为表创建时间戳时,它不再关心我在 __construct() 中设置的表名,它会尝试为名为 my_models 的表创建时间戳(这显然基于模型的类名),而不是为(在本例中)my_first_table 创建时间戳:

SQLSTATE[HY000]: General error: 1 no such table: my_models (SQL: insert into "my_models" ("updated_at", "created_at") values (2015-07-17 08:35:13, 2015-07-17 08:35:13))

有什么方法可以保留自动创建时间戳的动态表名?我在 Laravel 5.1 上。

最佳答案

当您调用 $myModel->create() 时,会创建一个新对象,并且不会将类型传递给其构造函数。

只需将 $type 作为属性之一传递给 $myModel->create(),更新构造函数:

public function __construct($attributes = array()) {
  if (array_key_exists('type', $attributes)) {
    $this->table = 'my_' . $attributes['type'] . '_model';
  }

  parent::__construct(array_except($attributes, 'type'));
}

它应该可以工作。

关于php - 创建时间戳会在构造函数中设置动态表名的模型引发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31471802/

相关文章:

php - Laravel Eloquent 多对多,增量是依赖的

javascript - jQuery - 获取元素的 ID,如果它等于值,则添加链接

php - Laravel Eloquent 选择具有 maxcreated_at 的所有行

Javascript (Vue.js) 无法在移动设备和其他连接的设备上运行,但可以在运行本地主机的桌面上运行

Laravel:为所有模型创建一个通用函数

php - 为什么我无法在这个 Eloquent 数据库调用方法中访问我的变量?

Laravel 仅为活跃用户选择帖子和评论

javascript - 当值超过数字时在浏览器中心弹出警告

php - Laravel POST请求错误405 : MethodNotAllowedHttpException

php - 类定义的顺序在 PHP 中重要吗?