我有4张桌子:


向导(ID,名称)
页面(id,page_number,wizard_id)
模块(ID,名称)
modules_pages(id,page_id,module_id,wizard_id)


这些模型是默认设置。

向导具有页面,页面具有模块。 modules_pages是一个联结表。当我显示由向导或由页面当前的wizard_id或我通过的页面过滤的页面中的数组时,无法获得模块列表。它只是多次显示模块。



页面模型

    public $belongsTo = array(
    'Wizard' => array(
        'className' => 'Wizard',
        'foreignKey' => 'wizard_id',
    ),
);
public $hasAndBelongsToMany = array(
    'Module' => array(
        'className' => 'Module',
        'joinTable' => 'modules_pages',
        'foreignKey' => 'page_id',
        'associationForeignKey' => 'module_id',
        'unique' => 'keepExisting',
    )
);


模块型号

public $hasAndBelongsToMany = array(
    'Page' => array(
        'className' => 'Page',
        'joinTable' => 'modules_pages',
        'foreignKey' => 'module_id',
        'associationForeignKey' => 'page_id',
        'unique' => 'keepExisting',
    ),
);

public $hasOne = array(
    'CodeReference' => array(
        'className' => 'CodeReference',
        'foreignKey' => 'code_reference_id',
    ),
);


向导模型

    public $hasMany = array(
    'Page' => array(
        'className' => 'Page',
        'foreignKey' => 'wizard_id',
        'dependent' => false,
        'conditions' => 'ModulesPage.wizard_id = Wizard.id',
    )
);




控制器

$this->loadModel('Page');
    $this->Page->recursive = 1;
    $options = array('Page.wizard_id' => $wizard_id);
    $page = $this->Page->find('first', $options);
    $this->set('page');

    $this->loadModel('ModulesPage');
    $this->ModulesPage->recursive = 2;
    $options = array('ModulesPage.wizard_id ' => $wizard_id,
                     'ModulesPage.page_number' => $page_number,
                     'ModulesPage.enabled' => 1);
    $modules = $this->ModulesPage->find('all', $options);

最佳答案

首先在AppModel中设置以下内容:
    公共$递归= -1;

您要在哪个控制器中放入该代码?您不需要使用loadModel-因为您已经将模型连接到了模型文件中,所以您可以像这样访问。

// access Module model from within PagesController
$this->Page->Module->find('all', $options);


$ options设置中也存在错误。条件是在数组中提供的,但它们必须位于另一个称为“条件”的数组中,例如

$options = array(
    'conditions' => array(
        //conditions go here
    )
);


最后,关闭递归后,您需要启用可包含的行为。更改我上面刚刚给出的$ options数组,如下所示(此示例将获取所有页面及其向导和模块)

$options = array(
    'conditions' => array(
        //conditions go here
    ),
    'contain' => array(
        'Wizard',
        'Module'
    )
);
$data = $this->Page->find('all', $options);


您可以使用其他阵列键进一步定义查询的其他选项,例如'order','group','limit'等。

关于php - 模特没有加入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24441292/

10-12 03:49