phalcon结果集复杂直接使用

时间:2014-02-11 15:36:30

标签: phalcon

我有两张桌子,我正在使用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] - &gt; 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]时,为什么setter / getters无效? 我在做一些我不应该做的事情吗? ......

2 个答案:

答案 0 :(得分:3)

因为它是如何运作的。你有这些方法的方法,如:

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&amp;吸气剂,而只是设置var的值。但是当您想要为某些输入字段实现新的验证时,您必须遍历设置值的所有代码,而不仅仅是编辑您的setter。我相信它有一些相同的逻辑,但我没有开发phalcon的核心,如果你想获得更多细节,你应该去检查他们的C代码:https://github.com/phalcon/cphalcon

答案 1 :(得分:0)

在以下信息中找到信息:

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]没有设置属性的原因是因为遍历意味着 它只会遍历对象,直接在遍历对象中设置的任何值 将丢失,因为不保留对象状态。

这非常有意义,尤其是在谈论大型结果集时 因为它会节省大量的内存。