【问题标题】:Kohana 3.3 ORM::factory('foo', $id) does not load model, missing something?Kohana 3.3 ORM::factory('foo', $id) 不加载模型,缺少什么?
【发布时间】:2013-03-08 22:30:46
【问题描述】:

我有以下型号:

class Model_Job extends ORM
{
    public $ID;

    public $user_ID;
    public $title;
    //some more variables
}

在我的控制器中,我有一个函数action_view();查看作业详情单作业,实现方式与http://kohanaframework.org/3.3/guide/orm/using#finding-an-object

public function action_view()
{
    $this->render('Shit');
    $this->template->content = View::factory('jobs/job')
                                    ->bind('job', $job);

    $job = ORM::factory('job', $this->request->param('id'));                    
}

我有另一个函数action_all(),它只是使用find_all 获取所有作业并将它们放在页面上,这很好用(意思是echo $job->ID 做了它应该做的;回显ID。但是action_view() 没有. 我会放一些echo Debug::vars($job)的输出

object Model_Job(39) {
    public ID => NULL //Note they are NULL
    public user_ID => NULL 
    public title => NULL
    ......................
    protected _object => array(5) (
        "ID" => string(1) "1"
        "user_ID" => string(1) "1"
        "title" => string(14) "Testbaantjeeee"
        ................
    )
    .....................
 }

而来自action_all()echo Debug::vars($job) 示例如下所示:

object Model_Job(39) {
    public ID => 1 //Note they are NOT NULL
    public user_ID => 1
    public title => "Testbaantjeeee"
    ......................
    protected _object => array(5) (
        "ID" => string(1) NULL       //now these are NULL
        "user_ID" => string(1) NULL
        "title" => string(14) NULL
        .....................
    )
    .....................
 }

我查看了 kohena 的有关 factoryfindfind_all 等的文档,但无法弄清楚 factoryfind 没有做 find_all 正在做的事情。我错过了什么吗?我让它工作了:

$job = ORM::factory('job')
           ->where('ID', '=', $this->request->param('id'))
           ->find_all()[0];

但是这样做对我来说完全没有意义。我错过了什么?

【问题讨论】:

  • 尝试将$_primary_key 属性设置为“ID”值。见kohanaframework.org/3.3/guide-api/ORM#property:_primary_key
  • 另外,你能显示你的型号代码吗?我不明白,为什么您需要公共字段(ID、user_ID 等),而 ORM 允许您“开箱即用”访问它们。
  • $job->object()['title'] 这行得通,protected _primary_key => string(2) "ID" public ID => NULL 没有改变任何东西。那是我的模型代码,还有一些属性,但没有方法或任何东西。
  • 不需要像ID这样的表字段。只需使用$job->title$job->ID(或$job->id())等

标签: php kohana kohana-orm


【解决方案1】:

好吧,我继续解决它。

我创建了一个类Model_Base

class Model_Base extends ORM
{
    public function Load()
    {
        foreach($this->object() as $key => $value)
            if(!is_object($value))
                if(property_exists(get_class($this), $key))
                    $this->$key = $value;
    }
}

现在我从这里扩展我的所有模型

class Model_Job extends Model_Base
{
    ..................
}

现在我的控制器使用这个:

public function action_view()
{
    $this->render('Shit');
    $this->template->content = View::factory('jobs/job')
                                    ->bind('job', $job);

    $job = ORM::factory('job', $this->request->param('id'));
    $job->Load();
}

它会转储:

object Model_Job(39) {
    protected _primary_key => string(2) "ID"
    public ID => string(1) "1"
    public user_ID => string(1) "1"
    public title => string(14) "Testbaantjeeee"
    ......................
}

我仍然认为这没有意义。但是无所谓。如果有人知道为什么他们使find()/factory('foo', $id)find_all() 如此根本不同以至于前者毫无用处,请告诉我:)

【讨论】:

    【解决方案2】:

    您正在为您的 id 使用不同的密钥,它是大写的 ID。确保在你的模型中设置

    protected $_primary_key = 'ID';
    

    因为按照您的示例,两种方法都应该完全相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多