我有两张桌子,我正在使用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无效? 我在做一些我不应该做的事情吗? ......
答案 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]没有设置属性的原因是因为遍历意味着 它只会遍历对象,直接在遍历对象中设置的任何值 将丢失,因为不保留对象状态。
这非常有意义,尤其是在谈论大型结果集时 因为它会节省大量的内存。