当前位置: 首页 > 知识库问答 >
问题:

创建时间戳会为构造函数中设置了动态表名的模型抛出错误

胡翔
2023-03-14

我有一个具有构造函数(如下)的雄辩模型,它采用$typeparam。这些类型是——比方说——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]\u table,因此我可以在3个表中的一个可用的情况下动态使用模型。这样地:

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

问题是,当Elount尝试为表创建时间戳时,它不再关心我在\uu construct()中设置的表名,而是尝试为名为my\u models的表创建时间戳(这显然是基于模型的类名),而不是为(在本例中)创建时间戳我的第一张表格

SQLSTATE[HY000]:一般错误:1没有这样的表:my_models(SQL:插入到my_models(updated_at,created_at)值(2015-07-17 08:35:13, 2015-07-17 08:35:13))

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

共有2个答案

杜弘伟
2023-03-14

有点晚了

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class MyModel extends Model {


    //-- using a mutator
    public function setTypeAttribute($type)
    {

        //-- set type =)
        $this->attributes['type'] = $type;

        //-- then use this type for your table name convention
        $this->setTable( 'my_'. $type .'_table' );

    }
}

?>
冯卜鹰
2023-03-14

当你调用$myModel-

只需将$type传递给$myModel-

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

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

它应该会起作用。

 类似资料:
  • 我想让我的子组件有一个ref,但是我不希望用户在创建组件时必须指定ref。所以说我有这样的东西: 我希望父组件能够访问子组件的状态。最简单的方法是为每个组件添加一个ref,但我希望这是在函数中完成的,以便从最终用户那里抽象出它,因为我希望这些组件被通用化。 有没有一种干净的方法可以让父组件访问子组件的状态,例如当创建子组件时,您有以下内容: 因此,在父类内部,我可以执行以下操作: 因此,我希望能够

  • 我有一个类(我不能修改),它只有一个构造函数,它接受一个参数,如下所示: 由于构造函数可以抛出错误,我想实现错误处理。我的第一次尝试是: 但是,现在在块的范围内,不能在其他地方使用。如果我理解正确,我不能在没有初始化的情况下声明对象,因此我可以在块之外声明。那么,我该如何捕捉构造函数抛出的错误呢? 编辑:为了澄清,这是在我的中,在中我将中止程序。此外,参数是一个将被打开的文件,因此没有已知的安全输

  • 我们正在构建一个与远程API通信的webapp。我想这样设计这个远程API的客户端: 关键是,我想在构建期间将凭据传递给这个客户端,并让所有其他方法使用这些凭据。我的第二个要求是我希望这个实例在会话中。 我在这里发现了如何传递动态构造函数参数。 我在这里发现了如何创建会话属性。 但我想不出一种方法来结合这两种技术。据我所知,您必须在自己的类getter方法中实例化会话属性。这种类似getter的方

  • 问题内容: 我知道在Java中不设置创建时间戳记是因为Linux没有它,但是有没有办法在Java中设置文件(Windows)的创建时间戳记?我在这里做了一个基本的修改时间戳编辑器。 问题答案: 我相信您有以下选择: 查找可以执行此操作并且可以从命令行调用的工具。然后,您可以通过Java代码与之交互。 以下来自MSDN File Times的链接显示了任何工具的工作方式-特别注意功能和。 在这里,我

  • Spring文档说: 每个类只能标记一个带注释的构造函数,但是可以注释多个非必需的构造函数。在这种情况下,每个都被认为是候选的,Spring使用最贪婪的构造函数,其依赖关系可以得到满足——也就是说,具有最多参数的构造函数。构造函数解析算法与具有重载构造函数的非注释类相同,只是将候选对象缩小为注释构造函数。 我测试了它,当我有另一个由 错误: 组织。springframework。豆。工厂BeanC

  • 我正在从一个教程中重构下面的代码。当我< s >运行编译它时,我得到以下错误: Vierbeiner类中的构造函数Vierbeiner不能应用于给定类型;必需:java.lang.找到字符串:无参数原因:实际参数列表和正式参数列表长度不同 我的理解是,发生这个错误是因为父类Vierbeiner有一个需要字符串参数的构造函数,而没有一个不需要参数的构造函数。我不明白的是,为什么我在没有创建Hund类