【问题标题】:Phalcon PHP: Set model source dynamically on initializePhalcon PHP:在初始化时动态设置模型源
【发布时间】:2014-03-14 02:14:29
【问题描述】:

我有一些简单的 EAV 表,它们都具有相同的结构,但用途不同:

item_attribute
id | attribute_name | size_limit

item_attribute_map
id | attr_id | source_id | value

还有:

transaction_attribute
id | attribute_name | size_limit

transaction_attribute_map
id | attr_id | source_id | value

使用这些的逻辑对于所有密集目的都是相同的,但显然会引用不同的表。

所以,我决定只制作一个可以更改其源代码的模型,如下所示:

class Attribute extends \Phalcon\Mvc\Model {
    public $id;
    public $attr_id;
    public $source_id;
    public $value;

    public function getSource($param){
        return $param.'_attribute_map';
    }
}

我考虑过重写 _construct(),传递参数,设置它,调用 parent::_construct() 并完成它;但这似乎并不优雅。有没有办法将参数传递给initialize()?我应该以另一种方式这样做吗?我不赞成在控制器中完成所有这些工作,因为这两个表设置了截然不同的东西,我想进一步使用这种数据库技术。

任何帮助将不胜感激,如果我不清楚,请告诉我,我会编辑。

编辑:好吧,我尝试了使用 __construct() 的不优雅的解决方案,并确定这是最终方法,现在我实际上已经没有想法了。

编辑 2:嗯,我找到了一种方法来做我想做的事(有点),即在模型实例化后调用 setSource()。不过我不是这个的忠实粉丝,因为它将模型链接到一个表,然后立即将它链接到另一个表。

编辑 3:我遇到了设置一个基类的想法,该基类将接受三个独立模型的创建请求,但在这些情况下,实际上只会创建一个模型,并相应地处理方法请求。这绝对是比上一个更好的解决方案,但我不喜欢针对特定情况制定全局规则,我宁愿在这些情况的范围内针对特定情况制定特定规则。我现在会使用这种方法,但我会留下这个问题,希望有人有更好的主意。

【问题讨论】:

  • 关于您在EDIT 3 上的最后一种方法,您不能简单地覆盖基类中的规则和行为吗? “将这些用于所有密集目的的逻辑是相同的”您能否就您的问题提供一些这种逻辑。我很难说你到底在问什么。
  • 坦率地说,我忽略了逻辑,因为我想知道是否有一种方法可以在第一次设置模型的源之前动态设置它。
  • 那么,你能否用你最近的尝试更新这个问题,比如你提到的基类?
  • 你得到问题的解决方案了吗?如果是,请分享解决方案

标签: php crud entity-attribute-value phalcon


【解决方案1】:

如果您希望在某些模型上使用相同的方法,只需创建基本模型并在您的模型中扩展它,而不是扩展 \Phalcon\Mvc\Model

class BaseModel extends \Phalcon\Mvc\Model {
  // functions what you need in several other models
}

class Attribute extends BaseModel  {
  // functions what you need in several other models
}

class Attribute extends BaseModel  {
  // functions what you need in several other models
}

我不明白你是否尝试过这个选项?也许你做过类似的事情?您应该在问题中添加更多代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-30
    • 2019-09-02
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 2019-05-31
    • 1970-01-01
    相关资源
    最近更新 更多