我正在使用 PhalconPHP ,到目前为止,我遇到的问题很少。
框架非常好。
然而,我遇到了一个我无法解决的问题。这可能是一件非常简单的事情,但我一直在圈子里跑,并且找不到任何关于这个问题的参考。
问题是,如果我还更新相关实体,我无法更新模型对象。
例如,假设我有几个模型类。
与
class Contact extends \Phalcon\Mvc\Model
{
public function initialize()
{
$this->belongsTo('email_id', 'Email', 'id', ['alias' => 'Email']);
}
}
和电子邮件:
class Email extends \Phalcon\Mvc\Model
{
public function initialize()
{
$this->hasMany('id', 'Contact', 'email_id', ['alias' => 'Contacts']);
}
}
当我尝试创建新的Contact
和Email
以下作品时:
$contact = new Contact();
// ... assign other fields here (i.e. name)
$email = new Email();
// ... assign other email fields here (i.e. address)
$contact->setEmail($email); // or $contact->email = $email;
$contact->save();
// record created
但是,当我尝试更新Contact
并更改Email
关系时,信息不会更新:
// Only update other fields
$contact->name = 'Some other name';
$contact->save(); // This works
// Update the related object
$contact->name = 'A new name';
$contact->setEmail($anotherValidEmail);
$contact->save(); // This doesn't work! Not even the name field is updated
我尝试使用update()
代替save()
。
我也尝试过使用$contact->email = $newEmailObject
,但我得到的结果相同。
有没有人遇到过这个问题?我做错了什么?
我正在使用 Mac OS X ,PhalconPHP 1.2.3
我还在Windows 8上使用PhalconPHP 1.1.0进行了测试
感谢任何帮助。
更新
我在save()之后打印了$ contact-> getMessages()的结果,但是我没有得到任何结果。就像save()成功一样,但是没有执行SQL语句。
最后更新:问题已复制且已找到解决方法!
我们已经能够复制这个问题。我们这样做:
$contact = Contact::findFirst(123);
if ($contact->email->emailaddress != $newaddress) {
$email = new Email();
$email->emailaddress = $newaddress;
$contact->email = $email;
$contact->save();
}
这不起作用!一旦我们比较电子邮件相关对象的emailaddress字段,就不能使用新地址保存的字符串。
但是,如果我们稍微修改一下代码并执行此操作:
$contact = Contact::findFirst(123);
if ($contact->email->emailaddress != $newaddress) {
$email = new Email();
$email->emailaddress = $newaddress;
// Load the record (again!)
$contact = Contact::findFirst(123);
$contact->email = $email;
$contact->save();
}
这实际上有效。
我想加载相关对象会影响更新该特定字段的能力,并再次找到联系对象,刷新相关对象。
所以,我们有一个解决方法,希望能帮助其他人面对同样的问题。
答案 0 :(得分:1)
使用$contact->setEmail($anotherValidEmail);
时,您必须在Contact model Contact中设置set和get方法。
例如:
Class Contact
{
public $email;
public function setEmail($email)
{
}
public function getEmail()
{
return $this->email
}
}
答案 1 :(得分:0)
在官方文字中有一个答案,你应该尝试一下(添加标志ACTION_CASCADE):
<?php
namespace Store\Models;
use Phalcon\Mvc\Model,
Phalcon\Mvc\Model\Relation;
class Robots extends Model
{
public $id;
public $name;
public function initialize()
{
$this->hasMany('id', 'Store\\Models\Parts', 'robots_id', array(
'foreignKey' => array(
'action' => Relation::ACTION_CASCADE
)
));
}
}
http://docs.phalconphp.com/en/latest/reference/models.html#cascade-restrict-actions
以上代码设置为删除所有引用的记录(部分) 如果主记录(机器人)被删除。
您还可以使用beforeDelete或afterDelete函数并添加所需的任何代码:
答案 2 :(得分:0)
Actually, your model should look like as below
class Contact extends \Phalcon\Mvc\Model
{
public $id;
public $name;
public $email;
public function initialize()
{
$this->belongsTo('email_id', 'Email', 'id', ['alias' => 'Email']);
}
public function columnMap()
{
return array(
'id' => 'id',
'name' => 'name',
'email' => 'email'
);
}
}
然后,
$ contact = new联络();
$ success = $ contact-&gt; save($ this-&gt; request-&gt; getPost(),array(&#39; name&#39;,&#39; email&#39;));
答案 3 :(得分:-2)
我遇到同样的问题,现在唯一的解决办法就是再次加载记录。