0

我有 2 张表用户和艺术家。

User:
id
name
password
city_id
state_id
country_id

Artist:
id
user_id
description

我希望创建添加和编辑表单(单个表单充当添加和编辑)。但是在单击编辑链接时,我希望填写用户和艺术家表的表单字段。我怎么做?下面是我的控制器代码:

public function artist_register() {
        $this->country_list();
        if ($this->request->is('post')) {
            $this->request->data['User']['group_id'] = 2;
            if ($this->{$this->modelClass}->saveAll($this->request->data)) {
                $this->redirect(array('controller' => 'Users', 'action' => 'login'));
            }
        }
        $this->render('artist_update');
    }

    public function artist_update($id) {
        $artist = $this->{$this->modelClass}->findByuser_id($id);
        $artist_id = $artist[$this->modelClass]['id'];

        if($this->request->is('get')) {
            $this->request->data = $this->{$this->modelClass}->read(null, $artist_id);
            $this->request->data = $this->{$this->modelClass}->User->read(null, $id);
        } else {
            if($this->{$this->modelClass}->save($this->request->data)) {
                $this->Session->setFlash('Your Profile has been updated');
                $this->redirect(array('action' => 'index'));
            }
        }
    }

代码不起作用。我该如何解决?

4

1 回答 1

1

首先要做的事:

User您必须定义和之间的关系Artist

A user has one artist
A user has many artist
A artist belongs to an user

在这种情况下,我认为您正在寻找的关系是:

A artist belongsTo user

编码时间:

知道了这一点,您现在可以定义关系。在您的Artist模型中,您需要声明belongsTo变量:

class Artist extends AppModel {
    public $belongsTo = 'User';
}

或者您可以像这样设置关系:

class Artist extends AppModel {
    public $belongsTo = array(
        'User' => array(
            'className'    => 'User',
            'foreignKey'   => 'user_id'
        )
    );
}

供您参考:

关联中还有另一个可能的键belongsTo

  • className:与当前模型关联的模型的类名。如果您要定义“艺术家属于用户”关系,则 className 键应等于“用户”。</p>

  • foreignKey:在当前模型中找到的外键的名称。如果您需要定义多个 belongsTo 关系,这将特别方便。此键的默认值是另一个模型的带下划线的单数名称,后缀为 _id。

  • conditions : find() 兼容条件或 SQL 字符串的数组,例如 array('User.active' => true)

  • type:在 SQL 查询中使用的连接类型,默认为 LEFT,这可能无法满足您在所有情况下的需求,当您想要主模型和关联模型中的所有内容或什么都不想要时,INNER 可能会有所帮助!(当然在某些条件下使用时有效)。(注意:类型值是小写的 - 即左,内)

  • fields:获取关联模型数据时要检索的字段列表。默认返回所有字段。

  • order : find() 兼容的 order 子句或 SQL 字符串的数组,例如 array('User.username' => 'ASC')

会发生什么?

这是$this->Artist->find()定义我们的关系后调用的结果。

Array
(
    [Artist] => Array
    (
        [id] => 5
        [user_id] => 1
        [description] => I am an artist!
    )
    [User] => Array
    (
        [id] => 1
        [name] => Fuhrmann
        [passsword] => 1234
        [city_id] => 500
        [state_id] => 2020
        [country_id] => 223
    )

)

所以呢?

毕竟,您可以User在查找时访问Artist

public function artist_update($id) {
    // Read the artist and the user info
    $artist = $this->{$this->modelClass}->findByUserId($id);        
    $this->set(compact('artist'));
}

在您看来,您可以获取用户名或Users表中的其他字段:

<input type="text" name="name" value="<?php echo $artist['User']['name'];?>"
<input type="text" name="user_id" value="<?php echo $artist['User']['id'];?>"
<input type="text" name="country_id" value="<?php echo $artist['User']['country_id'];?>"

阅读更多

阅读有关关联的更多信息:将模型链接在一起

于 2012-11-03T16:57:10.573 回答