【问题标题】:phalcon resultset complex direct usephalcon 结果集复杂直接使用
【发布时间】:2014-02-11 15:36:29
【问题描述】:

我有两张桌子,我正在使用phalcon's phql 加入它们。

在我的控制器中,我有:

$oBuilder = $this->modelsManager->createBuilder();
$oBuilder->columns(['Tabone.*', 'Tabtwo.*']);
$oBuilder->from(['Tabone']);
$oBuilder->join('Tabtwo', 'Tabone.id = Tabtwo.id');
$oBuilder->where('Tabone.id = 1');
$aRecords = $oBuilder->getQuery()->execute();

/** @var Phalcon\Mvc\Model\Resultset\Complex $aRecords */

//this doesnt work as expected
$aRecords[0]->tabone->setVal(2);
echo "2 != ".$aRecords[0]->tabone->getVal()."<br>";

echo get_class($aRecords[0]->tabone).'<br>';

//this works as expected
$aRecords->getFirst()->tabone->setVal(2);
echo "2 == ".$aRecords->getFirst()->tabone->getVal()."<br>";

所以,有了Phalcon's Complex Traversable resultset,我可以使用:

$resultset->getFirst()->tabone->setVal(2);
echo $resultset->getFirst()->tabone->getVal();

但是当我尝试时:

echo get_class($aRecords[0]->tabone); // Says tabone
$resultset[0]->tabone->setVal(2);
echo $resultset[0]->tabone->getVal();

值保持不变。即使 $aRecords[0]->tabone 是 Tabone 类。

这些是我的模型

class Tabone extends \Phalcon\Mvc\Model
{
    public $id;
    public $val;
    public function columnMap() {
        return array( 'id' => 'id', 'val' => 'val' );
    }
    public function setVal($val) { $this->val = $val; }
    public function getVal() { return $this->val; }
}
class Tabtwo extends \Phalcon\Mvc\Model
{
    public $id;
    public function columnMap() {
        return array( 'id' => 'id' );
    }
}

这些是 mysql 表和值

CREATE TABLE tabone (
    id INT(11) NOT NULL AUTO_INCREMENT,
    val INT(11) NOT NULL DEFAULT '0',
    PRIMARY KEY (id)
);
CREATE TABLE tabtwo (
    id INT(11) NOT NULL,
    PRIMARY KEY (id)
);
INSERT INTO tabone (id, val) VALUES (1, 1);
INSERT INTO tabtwo (id) VALUES (1);

为什么使用 [0] 时设置器/获取器不起作用? 我在做我不应该做的事吗? ...

【问题讨论】:

    标签: phalcon


    【解决方案1】:

    因为它是这样工作的。您可以使用这些方法,例如:

    offsetGet() // Gets row in a specific position of the resultset
    getFirst()  // Get first row in the resultset
    getLast()   // Get last row in the resultset
    

    所有方法都在这里:http://docs.phalconphp.com/en/latest/api/Phalcon_Mvc_Model_Resultset_Complex.html

    最好不要使用数组的键,为了简单起见,想象一下:

    您使用的是 setter 和 getter,而不是简单地设置 var 的值。但是,当您想为某些输入字段实现新的验证时,您必须检查您设置值的所有代码,而不仅仅是编辑您的设置器。我相信这里有一些相同的逻辑,但我不是在开发 phalcon 的核心,如果你想了解更多细节,你应该在这里查看他们的 C 代码:https://github.com/phalcon/cphalcon

    【讨论】:

    • 我认为这不是它的工作方式,因为在docs.phalconphp.com/en/latest/reference/phql.html 的 phql 参考中,它在某些时候说“在这种情况下,结果是一个对象 Phalcon\Mvc\Model\Resultset\复杂。这允许同时访问完整的对象和标量”,尽管它不清楚一次真正意味着什么......
    • 我要采用 OOP 方法 :)
    • 显然你可以做到这一点,但我正在寻找真正的原因,以便我可以学习新的东西。根据我从那里得到的信息,我认为可遍历接口本身不会保持状态,这非常适合我的情况。
    【解决方案2】:

    包含以下信息:

    http://forum.phalconphp.com/discussion/945/why-properties-of-models-are-lost-

    (...) 遍历结果集时,内存中只保留一条记录, 如果修改了一条记录,修改会丢失,因为记录被释放了 一旦不再使用。如果您是,此方案非常有效 遍历大型结果集 (...)

    然后继续 Scala: What is the difference between Traversable and Iterable traits in Scala collections?

    (...) 符合 Traversable 接口不需要 保持状态

    所以,[0]不设置属性的原因是因为traversable意味着只是 也就是说,它只遍历对象,任何直接设置在遍历对象中的值 会丢失,因为对象状态没有保留。

    这很有意义,尤其是当您谈论大型结果集时 因为它将节省大量内存。

    【讨论】:

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