0

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

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

发票进入一个名为:invoices 的数据库

客户名称未存储在 invoices 表中,仅存储 id

客户信息存储在一个名为:clients 的数据库中

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

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

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

为了首先使这个问题简短,请通过评论请求特定代码。即控制器代码,视图代码等......提前谢谢你。

额外的想法

如果我不使用 CakePHP,我可以使用类似下面的东西,所以我想我只是不知道如何将它放入 cakephp“语言”中。

<?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'));

    }
4

2 回答 2

1

您是否正确设置了模型关联?如果是这样,您应该能够做一些事情,例如$invoice['Client']['client_name']假设您没有使用recursive = -1.

/edit:好的,我不介意扔掉一些代码,但这是一个基本概念,你必须试着绕开你的脑袋。连接到另一个模型的每个模型都必须建立关联,否则事情会很痛苦。

我假设一个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。作为 的倒数hasManybelongsTo我们有一个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'].

于 2013-11-04T18:56:12.980 回答
0

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

于 2013-11-05T05:30:30.877 回答