Стол Zend Db Double JOIN

0
1. plan_payment_type:
   id
   plan_id

2. plan
   id
   payment_period

Это внешний ключ между plan_payment_type.plan_id и plan.id. В моем коде я знаю $plan_payment_type_id.

Моя задача - выбрать payment_period. Шаги:

  • Выберите plan_id из plan_payment_type
  • Выберите payment_period from plan с выбранным plan_id

Как я могу сделать это с помощью одного запроса в Zend Framework? Большое вам спасибо.

Теги:
join
zend-framework

2 ответа

2
Лучший ответ

Следующий оператор 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);
  • 0
    Благодарю. Работает нормально с небольшими изменениями.
1

Прежде всего я бы организовал их по-другому. Разве это не plan.types, который должен иметь plan.id. Это нелогично. У вас есть таблица с параметрами plan_types, у которой есть plan.id и имя plan.name, и это отношение находится в таблице плана через plan.type_id.

Эти зависимости решаются следующим образом:

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 Class функцию:

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

и для получения всех планов типа x в классе строк Plan_type

public function entries() {
    return $row->findDependentRowset('Plan');
}
  • 0
    Tomalak ответ лучше для меня. Спасибо, Elzo Valugi .
  • 0
    +1, потому что вы правы в отношении размещения БД. Наличие plan_id для plan_payment_type не имеет смысла для меня.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню