根据cakephp查询中的条件设置模型

时间:2012-11-19 05:33:47

标签: php cakephp cakephp-1.3

这可能很容易做到,但我现在似乎无法理解它。假设在cakephp应用程序的一个组件中,我有一个变量my_model,它包含当前使用该组件的相应控制器的模型:

function TestComponent extend Object
{
    var $my_model; // can be either User, or Person

    function test()
    {
        $myModelTemp = $this->my_model; 

        $model = $myModelTemp != 'User' ? $myModelTemp.'->User' : 'User';

        $this->$model->find('all'); 
    }
}

正如您在我的函数test()中所见,我要做的是根据my_model的值调用正确的模型。所以根据条件,我的查询将是:

$this->Person->User->find('all');

或者

$this->User->find('all');

当我像上面那样做时,我收到错误Fatal error: Call to a member function find() on a non-object。换句话说,该错误意味着Person->User不是对象(因此,它被视为字符串)。

2 个答案:

答案 0 :(得分:0)

你所说的可能是真的,但是,它可以指代电话的任何部分。

因此,无论是人员还是用户都可能无效,或者它们一起导致错误。很难说。 尝试使用var_dump();

转储单个对象

所以试试:

<?php
    echo "<pre>";
    var_dump(is_object($this->Person));
    var_dump(is_object($this->User));
    echo "</pre>";
?>

确定代码出错的位置。 要清楚,返回值必须为真,才能成为一个对象。

返回false的那个可能是罪魁祸首。

如果您的问题引用了引用对象的正确方法,则对象基本上是一个数组。例如:

<?php 
    $obj = (object) array("this", "my_function");
?>

上面的示例将数组转换为对象。但是,使用多个图层可能比您预期的更困难。

答案 1 :(得分:0)

一般来说,看起来你可能会犯这个错误。显然你希望这些模型是动态的,但是那时你就会对事物进行硬编码,从而在一开始就破坏它的动态性。

通过在组件中执行所有操作,您似乎可能违反了CakePHP和MVC的主体。我不确定这个组件是真的应该操纵模型还是假设当前正在使用哪些模型。

但是,如果要将字符串计算为实际对象,可以将其包装在{ ... }中(这是有效的标准PHP语法,而不是特定于Cake的代码)。

试试这个:

$modelName = $this->my_model; 

$model = ($modelName != 'User') ? $this->{$modelName}->User : $this->User;

$model->find('all');

现在,如果这不起作用或者您收到错误消息,说它无法找到模型,则需要确保在当前范围内实际加载和初始化模型。