【问题标题】:Adding new records to a Phalcon model not correctly creating the relation向 Phalcon 模型添加新记录未正确创建关系
【发布时间】:2014-12-16 02:47:17
【问题描述】:

我在ClientAddresses 之间有1:n 关系。一个客户端可以有多个地址。

我创建了以下模型:

class Client extends ModelBase
{    
    $this->hasMany("id", "ClientAddress", "client_id", array(
      "alias" => "addresses"
    ));

class ClientAddress extends ModelBase
{

  public function initialize()
  {
    parent::initialize();                                              
    $this->belongsTo("client_id", "Client", "id", array(
      "alias" => "client"
    ));

    $this->belongsTo("address_id", "Address", "id", array(
      "alias" => "address"
    ));
  }

class Address extends ModelBase
{

我想对 Address 执行一些 CRUD 操作。

我尝试创建一个新的Address 并使用以下方法将其链接到ClientAddress。它确实在Address 表中创建了记录,但它没有通过ClientAddress 表链接到它。

$client = Client::findFirst($current_client_id);
$address = new Address();
$address->setName( $this->request->getPost("name") );
$address->setAddress1( $this->request->getPost("address1") );
$address->setAddress2( $this->request->getPost("address2") );
$address->setSuburb( $this->request->getPost("suburb") );
$address->setState( $this->request->getPost("state") );
$address->setPostcode( $this->request->getPost("postcode") );
$address->setCountry( $this->request->getPost("country") );

$client->addresses = $address;
$client->save();

我在这里做错了什么?

【问题讨论】:

    标签: php phalcon


    【解决方案1】:

    多对多关系是一系列关系。一个微妙的变化,一切都应该工作。

    $client->addresses[] = $address;
    $client->save();
    

    侧边栏:

    我认为本杰明提出了一个关于地址关联的有效观点。想想像亚马逊这样的网站,您可以从列表中选择要运送到的地址。它们与您的帐户相关联,而不是与您之前的订单相关联。

    之前我已经建立了多个电子商务和 CRM 关系,因此非常习惯这种模式。

    【讨论】:

    • 谢谢,但我不确定关于地址关联的观点。当然,您可以选择与您的帐户(或在我的情况下为您的客户)相关联的先前保存的地址,但最终必须与订单相关联。就我而言,我可以在一个订单上有多个地址,这就是我需要中间表的原因。
    【解决方案2】:

    首先,对于 1:n 关系,您不需要交叉表。

    试试这样的东西

    class Client extends \Phalcon\Mvc\Model
    {
    
       public function initialize()
       {
       $this->hasMany('id', 'Address', 'client_id', NULL);
       }
    }
    
    
    class Address extends \Phalcon\Mvc\Model{
    
       public function initialize()
       {
       $this->belongsTo('client_id', 'Client', 'id', array('foreignKey' => true));
    
       }
    }
    

    编辑:

    class Client extends \Phalcon\Mvc\Model
    {
    
    
        public function initialize()
        {
            $this->hasMany("id", "ClientAddress", "client_id");
        }
    
    }
    
    
    class Address extends \Phalcon\Mvc\Model
    {
    
    
        public function initialize()
        {
            $this->hasMany("id", "ClientAddress", "address_id");
        }
    
    }
    
    
    class ClientAddress extends \Phalcon\Mvc\Model
    {
    
    
        public function initialize()
        {
            $this->belongsTo("client_id", "Client", "id");
            $this->belongsTo("address_id", "Address", "id");
        }
    
    }
    

    可以这样拨打电话

    $client = Client::findFirst($current_client_id);
    $address = new Address();
    ...
    $address->save();
    $clientAddress  = new ClientAddress ();
    
    $clientAddress->setClient_id($client->getId());
    $clientAddress->setAddress_id($cddress_id->getId());
    $clientAddress->save();
    

    可能会在出现问题时添加一些检查和回滚。

    【讨论】:

    • 谢谢。但问题是,这些地址记录不仅用于客户——它们还用于其他东西,例如订单等,这就是我有交叉表的原因。
    • 想想你的逻辑。认为订单应该与客户而不是地址有关系。
    • 订单有地址(允许多个地址)。所以我将有相同的订单交叉表,称为 order_addresses。
    猜你喜欢
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 2020-10-13
    • 2013-03-30
    • 2021-08-14
    • 1970-01-01
    相关资源
    最近更新 更多