【问题标题】:Zend Db Table Double JOINZend Db 表双重联接
【发布时间】:2010-10-13 06:36:19
【问题描述】:
1. plan_payment_type:
   id
   plan_id

2. plan
   id
   payment_period

它是plan_payment_type.plan_idplan.id 之间的外键。在我的代码中,我知道一个 $plan_payment_type_id。

我的任务是选择payment_period。 步骤:

  • plan_payment_type 中选择plan_id
  • 选择payment_period from plan 并选择plan_id

如何在 Zend Framework 中使用一个查询来完成? 非常感谢。

【问题讨论】:

    标签: php mysql zend-framework join


    【解决方案1】:

    以下SQL语句与PHP代码一一对应:

    SELECT
      t.id AS plan_payment_type_id,
      p.id AS plan_id,
      p.payment_period
    FROM
      plan_payment_type AS t
      INNER JOIN plan AS p ON p.id = t.plan_id
    WHERE
      p.id = { SQL query param for $plan_payment_type_id }
    
    
    $select = $db->select()
              ->from(array('t' => 'plan_payment_type'),
                     array('id' => 'plan_payment_type_id'))
              ->join(array('p' => 'plan'), 'p.id = t.plan_id',
                     array('id' => 'plan_id', 'payment_period'))
              ->where('p.id = ?', $plan_payment_type_id);
    

    【讨论】:

      【解决方案2】:

      在一切之前,我会以不同的方式组织它们。不是应该有plan.id 的plan_types。这不合逻辑。你有一个带有 plan_types 的表,它有一个 plan.id 和一个 plan.name,关系通过 plan.type_id 在计划表中。

      这个dependencies是这样解决的:

      class Payment_Plan extends Zend_Db_Table_Abstract
      {
          protected $_name            = 'plan';
          protected $_referenceMap    = array(
              'Plan' => array(
                  'columns'           => 'plan_id',
                  'refTableClass'     => 'Plan',
                  'refColumns'        => 'id'
              )
      
      }
      
      class Plan_Type extends Zend_Db_Table_Abstract
      {
          protected $_name            = 'plan_types';
          protected $_dependentTables = array('Plan_Type');
      }
      

      稍后你可以在 PlanRow 类中拥有一个函数:

      public function type() {
          return $this->findParentRow('Plan_Type');
      }
      

      以及在 Plan_type 行类中获取所有类型 x 的计划

      public function entries() {
          return $row->findDependentRowset('Plan');
      }
      

      【讨论】:

      • Tomalak 答案对我来说更好。谢谢,Elzo Valugi
      • +1 因为您在数据库布局方面是正确的。在plan_payment_type 上使用plan_id 对我来说也没有意义。
      • 我认为您的 $_referenceMap 变量中缺少一个 ')'
      猜你喜欢
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      相关资源
      最近更新 更多