簡體   English   中英

在Phalcon中附加一個相關的模型

[英]append a related Model in Phalcon

我在PHP中用Phalcon編寫了一個vcard類。 vCard模型初始化如下。

// Inside the BS_VCard class
public function initialize(){
    $this->hasMany("id","BS_VCardElement","vCardId",array(
        "alias" => "elements",
        'foreignKey' => array(
            'action' => Phalcon\Mvc\Model\Relation::ACTION_CASCADE
        )
    ));
}

它的元素是這樣初始化的

// Inside the BS_VCardElement class
public function initialize(){
    $this->belongsTo("vCardId","BS_VCard","id",array("alias" => "vCard"));
    ...
}

如果用戶讀取vCard並添加另一個元素,則它無法按預期工作。 為了簡化使用,我添加了一些像這樣的fascade方法

public function addDateOfBirth($date){
    $element = new BS_VCardElement();
    $element->setName("BDAY");
    $element->addValue($date);
    // This doesn't work
    $this->elements[] = $element;
}

Docs / Storing相關記錄沒有解釋如何將這樣的新數據附加到相關表中。

我也嘗試過這個

$this->elements[] = array_merge($this->elements,array($element));

但是save方法似乎忽略了添加的元素。 Save()返回true。

這個問題已在幾個月前被問過,但自從我遇到類似的問題后,我決定分享我的結果。

這就是我發現的。 小寫別名('elements')似乎不起作用,而大寫別名('Elements')則起作用。

要添加一個元素,您可以執行此操作;

$this->Elements = $element;

要添加多個元素,您可以執行此操作;

$elements = array($element1, $element2);
$this->Elements = $elements;

之后,您必須在再次訪問元素之前保存vcard。 如果不這樣做,phalcon將只返回一個只包含數據庫中已有元素的結果集。 (不確定這是否可以某種方式改變。)

這里是文檔(沒有提到所有這些): http//docs.phalconphp.com/en/latest/reference/models.html#storing-related-records

根據Phalcon源代碼 ,Resultset對象是不可移植的。

/**
 * Resultsets cannot be changed. It has only been implemented to 
 * meet the definition of the ArrayAccess interface
 *
 * @param int index
 * @param \Phalcon\Mvc\ModelInterface value
 */
public function offsetSet(var index, var value)
{
    throw new Exception("Cursor is an immutable ArrayAccess object");
}

看來用數組替換元素是實現“追加”或修改結果集的唯一方法(除了支持IS的刪除)。

當然這打破了\\Phalcon\\Mvc\\Model::_preSaveRelatedRecords()因為該函數忽略了類屬性並從模型管理器中重新獲取相關(並在最后重置了model::$element屬性)。

我對此感到沮喪,因為將對象附加到集合看起來像是一個非常常見的任務,並且沒有一個明確的方法向父母添加新項目似乎是一個設計缺陷。

我認為相關元素在設置屬性時可能會調用一些神奇的功能,所以簡單地使用$ this-> elements [](顯然)不起作用。 也許嘗試重新設置整個變量:

public function addDateOfBirth($date){
    $element = new BS_VCardElement();
    $element->setName("BDAY");
    $element->addValue($date);

    $elements = $this->elements;
    $elements[] = $element;
    $this->elements = $elements;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM