2014-03-10 3 views
1

Я использую cakephp 2.xx. У меня есть две таблицы в именах и полях моей базы данных. Я пишу innerjoin для отображения имен с их полом. пол идет из таблицы полов. мой контроллер нижеизвлекать данные из нескольких таблиц в cakephp

class NamesController extends AppController { 
public $helpers = array("Html", "Form"); 
public function index() { 
    $this->loadModel("names"); 
$query_options = array(); 
$query_options["fields"] = array("names.Name","genders.gender"); 
$query_options["joins"] = array("table" => "genders", "alias" => "genders", "type" => "INNER", "conditions" => array("genders.id = names.Gender_id",)); 
$this->set("gender", $this->names->find('all', array($query_options,'limit' => 10 ,'recursive' => 1))); 
} 
} 

названия модели

class Names extends AppModel { 
    var $belongsTo = 'Genders';  
} 

и гендерная модель

class Genders extends AppModel {  
    var $hasMany = 'Names'; 
    } 

и CTP код

foreach ($gender as $post); 
echo $post["names"]["Name"]; 
echo $post["genders"]["gender"]; 

это печать Имя штрафа. но не печатает пол и приводит к неопределенному индексу: полов. Пожалуйста, помогите

+0

Используйте соединения, если вам нужны условия детского стола. Используйте include для извлечения данных дочерних таблиц. Используйте их, когда это необходимо. :) –

+0

Я использую объединения и содержал индивидуально и отдельно, но тот же результат –

+0

Проверьте, работает ли мой ответ на вас. –

ответ

1

Моя рекомендация, вам не обязательно следовать ему: используйте уникальные имена для моделей (имя, пол). Таким образом, он автоматически соединится с соответствующей таблицей (именами, полами), и ваши модели будут автоматически загружаться в свои контроллеры (NamesController, GendersController). Если вы не следуете этому совету, измените код ниже (загрузите модель вручную, как и в своем вопросе, и установите $ useTable в модели).

Вариант 1: получение всех имен, содержащих данные по полу:

class NamesController extends AppController { 

    public function index() { 
     $this->Name->Behaviors->load('Containable'); 
     $query_options = array(
      'fields' => array("Name.name"), 
      'contain' => array(
       'Gender' => array(
        'fields' => array('Gender.gender'), 
       ), 
      ), 
     ); 
     $this->set("names", $this->Name->find('all', $query_options)); 
    } 
} 

Вариант 2: получение полов, содержащих все имена, принадлежащие им:

class NamesController extends AppController { 

    public function index() { 
     $this->Name->Gender->Behaviors->load('Containable'); 
     $query_options = array(
      'fields' => array("Gender.gender"), 
      'contain' => array(
       'Name' => array(
        'fields' => array('Name.name'), 
       ), 
      ), 
     ); 
     $this->set("genders", $this->Name->Gender->find('all', $query_options)); 
    } 
} 

Используйте отлаживать ($ имена) или debug ($ genders) в вашем представлении, чтобы увидеть структуру выходного массива.

+0

Я попробовал вариант 1 и 2, но тот же результат. как я могу применять особые имена. Я написал только один контроллер имен контроллеров. нет других genedercontrollers. нужно ли написать другое, если да, то как. Спасибо –

+0

Это была только рекомендация, она будет работать без него ... Это означает, что когда у вас есть таблица «names» и таблица «genders», вы можете получить доступ к модели «Пол» и использовать ее функции модели, даже не определяя, что модель. Это то, как работает торт. Но это не имеет отношения к вашему вопросу. Можете ли вы отладить полученный результат и опубликовать результаты? –

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