PhalconPHP框架 - 如何更新模型对象和相关对象

时间:2013-08-20 23:30:11

标签: php orm phalcon

我正在使用 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']);
    }
}

当我尝试创建新的ContactEmail以下作品时:

$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();
  }

这实际上有效。

我想加载相关对象会影响更新该特定字段的能力,并再次找到联系对象,刷新相关对象。

所以,我们有一个解决方法,希望能帮助其他人面对同样的问题。

4 个答案:

答案 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函数并添加所需的任何代码:

http://phalcon-php-framework-documentation.readthedocs.org/en/latest/reference/models.html#deleting-records

所有其他可用的偶数: http://phalcon-php-framework-documentation.readthedocs.org/en/latest/reference/models.html#events-and-events-manager

答案 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)

我遇到同样的问题,现在唯一的解决办法就是再次加载记录。