使用CakePHP将客户端ID更改为客户端名称

时间:2013-11-04 18:53:03

标签: php mysql sql cakephp

好的,我在CakePHP中有一个提交到数据库的表单。在这种形式中,它提交一个名为client_id的字段,并将其存储在数据库中。

然后我有一个观点允许我查看所有已创建的发票。要查看负责发票的客户,我目前只能通过在视图中放置<?php echo $invoice['Invoice']['client_id']; ?>来查看表单中输入的ID。

发票转到一个名为:发票

的数据库

客户名称未存储在发票表中,只是存储在

客户端信息存储在一个名为:clients

的数据库中

我希望能够在发票视图中实际显示客户实名,而不是客户ID。

我尝试将以下查询添加到我的索引控制器中,但我不确定在此之后该怎么做或者这是否正确。

$this->set('clients', $this->Invoice->query("SELECT * FROM clients WHERE id='89545'"));

为了首先解决这个问题,请通过评论请求具体代码。即控制器代码,视图代码等...提前感谢您。

其他想法

如果我没有使用CakePHP,我可以使用类似下面的内容,所以我想我只是不知道如何把它变成cakephp“language”。

<?php
 query($con, "SELECT name FROM clients WHERE id='$client_id'");

echo $row['name'];
?>

大致!

更新

以下是我的模特

第一个是Client.php

<?php

class Client extends AppModel {
    public $hasMany = array(
        'Invoice' => array(
            'className' => 'Invoice',
            'foreignKey' => 'client_id'
        )
    );
}

?>

第二个是Invoice.php

<?php

class Invoice extends AppModel {
     public $belongsTo = array(
        'Client' => array(
            'className' => 'Client',
            'foreignKey' => 'client_id'
        )
    );
}

?>

最后,要从数据库中获取发票,我在内部使用以下内容:InvoicesController.php

public function index() {
        $this->set('invoices', $this->Invoice->find('all'));

    }

2 个答案:

答案 0 :(得分:1)

您是否正确设置了model associations?如果是这样,假设您没有使用$invoice['Client']['client_name'],那么您应该可以执行recursive = -1之类的操作。

/编辑:好的,我不介意抛出一些代码,但这是一个基本的概念,你必须尝试包围你的头。连接到另一个模型的每个模型都必须设置关联,否则事情会很痛苦。

我假设Client hasMany Invoice。因此,每张发票都是特定于客户的,并且他们可以有多张发票(例如2013年10月与2013年11月发票)。从CakePHP页面我们看到:

class User extends AppModel {
    public $hasMany = array(
        'Comment' => array(
            'className' => 'Comment',
            'foreignKey' => 'user_id',
            'conditions' => array('Comment.status' => '1'),
            'order' => 'Comment.created DESC',
            'limit' => '5',
            'dependent' => true
        )
    );
}

因此,使用它作为我们的模板,我们最终得到:

public $hasMany = array(
    'Invoice' => array(
        'className' => 'Invoice',
        'foreignKey' => 'client_id'
    )
);

那就是Client.php。由于hasMany的倒数为belongsTo,我们有一个Invoice belongsTo Client。再次,使用CakePHP页面作为模板,我们最终得到:

 public $belongsTo = array(
    'Client' => array(
        'className' => 'Client',
        'foreignKey' => 'client_id'
    )
);

那就是Invoice.php。设置完这些关联后,无论何时执行$this->Invoice->find('all');$this->paginate('Invoice');,使用正确的$recursive设置,Cake都会抓取相应的Client记录。这使您可以执行我之前说过的操作,例如$invoice['Client']['client_name']

答案 1 :(得分:0)

你也可以使用$ actsAs = array('Containable');在模型中,为了在控制器的find方法中使用'contains'指令(而不是使用递归,这很可能会在具有许多关系的模型上获得不需要的数据)