0

我正在使用 cakephp 2.1.3 并且我有一个表成分和表成分别名当我选择成分别名时我希望在我的页面索引中的成分中我想查看成分别名和一些成分文件但我不知道是否我必须对我的控制器进行两次查询,或者只设置成分 ID 和 cakephp 自动检索我的数据。现在我在我的控制器中做了两个查询,但我不知道这是否是最好的方法

$this->set('ingredient', $this->Ingredient->read());            $this->set('ingredient_alias',$this->Ingredient->IngredientAlias->read()); 

这是我的桌子:

class Ingredient extends AppModel {
    public $name = 'Ingredient';
    public $useTable = 'ingredients';
    public $belongsTo = 'User';

    public $hasMany = array (
        'IngredientAlias' => array (
            'className'     => 'IngredientAlias',
            'foreignKey'    => 'ingredient_id'
        )
    );
}

class IngredientAlias extends AppModel {
    public $name = 'IngredientAlias';
    public $useTable = 'ingredient_aliases';
    public $belongsTo = array(
        'Ingredient' => array(
            'className'    => 'Ingredient',
            'foreignKey'   => 'ingredient_id'
        )
    );
}

这是我的 IngredientsController (我已经将 putt alias 的路径更改为我的参数并且它正在工作)

public function edit ($alias) {
        $ing = $this->Ingredient->IngredientAlias->find('first', array(
                    'conditions' => array('IngredientAlias.alias' => $alias)));
        $this->Ingredient->IngredientAlias->id= $ing['IngredientAlias']['id'];
        $this->Ingredient->IngredientAlias->set('ingredient_id',$ing['IngredientAlias']['ingredient_id']);
        $this->Ingredient->id= $ing['IngredientAlias']['ingredient_id'];
        if (!$this->Ingredient->IngredientAlias->exists()) {
                throw new NotFoundException ('Nessuna corrispondenza trovata per questo ingrediente');
            }
            if (!$alias) {
                $this->set('flash_element','error');
                $this->Session->setFlash ('Ingrediente non valido');
            }
            $this->Ingredient->recursive = 2;
            $this->set('ingredient', $this->Ingredient->read());
            $this->set('ingredient_alias',$this->Ingredient->IngredientAlias->read());
    }
4

1 回答 1

0

根据您描述的关系以及如果您调用表中是否有ingredient_id键:ingredient_aliases

$this->Ingredient->find('first', array('conditions' => array('Ingredient.id' => $id)));

您将获得由 $id 指定的成分记录,以及与它相关的所有成分别名记录,其数组结构类似于以下内容:

Array =>
    [Ingredient] => Array
                        [id] => 3
                        [other_data_from_DB] =>
                        .....
    [IngredientAlias] => Array => 
                         [0] => Array =>
                                [id] => 1
                                [ingredient_id] => 3
                                [other_data_from_DB] =>
                                ....
                         [1] => Array =>
                                [id] => 2
                                [ingredient_id] => 3
                                [other_data_from_DB] =>
                                ....
                         [2] => Array =>
                                [id] => 3
                                [ingredient_id] => 3
                                [other_data_from_DB] =>
                                ....

由于 hasMany 关系,因此对 IngredientAlias 数组子结构进行了索引。如果您没有看到相关的 IngredientAlias 记录,请检查您的模型的递归属性

debug($this->Ingredient->recursive);

如果它等于 -1,那么只会获取成分模型数据。在我提供的链接中查看其他递归值的作用。

如果你想反其道而行之,你应该通过 IngredientAlias 模型:

$this->IngredientAlias->find('first', array(CONDITIONS));

将提供 CONDITIONS IngredientAlias 记录中指定的内容及其连接的成分记录。由于关系,成分记录将只有一个IngredientAlias belongsTo Ingredient

于 2012-06-20T19:12:46.327 回答