2015-08-17 5 views
5

Я новичок в CakePHP, и я пытаюсь построить сложный запрос для результатов. Это убивает меня. Может быть, некоторые могут помочь мне здесь. Я использую торт 2.7Как создать правильный запрос CakePHP для вложенных отношений

У меня есть две таблицы с тремя отношениями (многие из многих). Neighbourhood и Polygon. Корпус выглядит так: Neighbourhood имеет много Neighbourhoods, и он также принадлежит многим Neighbourhoods. Также Neighbourhood имеет множество Polygons и Polygon принадлежит mnay Neighbourhoods.

Neighbourhood таблица содержит 2 поля name и zip. Я получаю от пользователя zip code.

А теперь, что я хочу: Я хочу, чтобы получить все Polygons от Neighbourhood и это Neighbours. Где Neighbourhood.zip = defined by user.

Как я могу это сделать? Должен ли я писать пользовательский запрос или делить процесс на более мелкие шаги? Я борюсь с этим весь день.

Вот как модель отношения выглядят любят:

class Neighbourhood extends AppModel 
{ 
    var $hasAndBelongsToMany = array(
     'Neighbourhoods' => array(
      'className' => 'Neighbourhood', 
      'joinTable' => 'neighbourhoods_neighbours', 
      'foreignKey' => 'neighbourhood_id', 
      'associationForeignKey' => 'neighbour_id', 
      'unique' => false 
     ), 
     'Polygon' => array(
      'className' => 'Polygon', 
      'joinTable' => 'neighbourhoods_polygons', 
      'foreignKey' => 'neighbourhood_id', 
      'associationForeignKey' => 'polygon_id', 
      'unique' => false 
     ), 
    ); 
} 


class Polygon extends AppModel 
{ 
    var $hasAndBelongsToMany = array(
     'Neighbours' => array(
      'className' => 'Neighbourhood', 
      'joinTable' => 'neighbourhoods_polygons', 
      'foreignKey' => 'polygon_id', 
      'associationForeignKey' => 'neighbourhood_id', 
      'unique' => false, 
     ) 
    ); 
} 

ответ

1

Вам необходимо включить Containable поведения в моделях или даже лучше один раз установить его в вас приложении модели.

public $actsAs = array('Containable'); 

И затем начните создавать свои запросы, например.

$conditions = array(
    'conditions' => array('id' => '123'), 
    'contain' => array(
     'Neighbourhood'=>array(
       'conditions' => array('Neighbourhood.id' => '123') 
     ) 
    ), 
    // or even joins 
    'joins' => array(
      array(
        'table' => $this->getTableName('default', 'neighbourhoods'), 
        'alias' => 'Neighbourhood', 
        'type' => 'RIGHT', // OR LEFT 
        'conditions' => array(
         'Neighbourhood.id = Polygon.neighbourhood_id', 
         'Neighbourhood.deleted' => 0, 
        ) 
     ) 
    ) 
); 

$polygons = $this->Polygon->find('all', $conditions); 

Если вы думаете, что это не делает достаточно (для того, чтобы сделать более сложные запросы), то вам нужно будет строить свои высказывания запроса. например выполнение запроса от Polygon модели:

$dbo = $this->getDataSource(); 
    $query = $dbo->buildStatement(
      array(
       'fields' => array(
        'Polygon.name AS polygon_name', 'Polygon.size', 
        'Neighbourhood.name AS neighbourhood_name', 'Neighbourhood.lat', 
        'IF(Neighbourhood.created > DATE_SUB(NOW(), INTERVAL 1 DAY) , 1 , 0) AS new_neighbourhood' 
       ), 
       'table' => $dbo->fullTableName($this), 
       'alias' => 'Polygon', 
       'limit' => null, 
       'offset' => null, 
       'joins' => array(
        array(
         'table' => $this->getTableName('default', 'neighbourhoods'), 
         'alias' => 'Neighbourhood', 
         'type' => 'LEFT', 
         'conditions' => array(
          'Neighbourhood.id = Polygon.neighbourhood_id', 
         ), 
         'order' => 'Neighbourhood.name ASC', 
        ), 
        .... 
       ), 
       'conditions' => $conditions, 
       'group' => 'Polygon.name', 
       'order' => 'Polygon.name ASC', 
      ), 
      $this 
    ); 

$polygons = $this->query($query); 

И если вы думаете, даже этого не достаточно, то вы должны петь удивительную благодать, как это ..

$polygons = $this->query("Here your sql query"); 

debug($polygons); 
+1

я сумел создать запрос свой путь, который работал , спасибо, что показал мне способ – Vardius

+0

Мое удовольствие. это не так, потому что это для cakephp 2.x, которого у вас нет большой гибкости. Но в cakephp 3.x, который является ORM, вы можете делать почти все гораздо проще. – Fury

+0

Рамка и версия не были моим выбором, это был выбор клиента. я поступаю так, как мне говорят. – Vardius

Смежные вопросы