【问题标题】:Choosing field names while finding results from two tables从两个表中查找结果时选择字段名称
【发布时间】:2011-05-22 07:02:37
【问题描述】:

我有两个表(恰好位于两个不同的数据库中)。 “clients”和“domains”,客户端可以有多个域。

这是我正在使用的代码:

$this->Domain->find('all', array(
    'order' => 'domain ASC',
    'fields' => array(
        'Domain.id',
        'Domain.domain',
        'Server.name',
        'Client.id',
        'Client.name'
    )
));

当我不使用 'fields' => array() 返回所有字段时,一切正常,只要我要求特定字段,它就会说:

SQL 错误:1054:未知列 '字段列表'中的'Client.id'

如果我只删除两个客户端列,一切也都可以正常工作(客户端模型是另一个数据库上的唯一模型。

【问题讨论】:

    标签: php sql cakephp cakephp-1.3


    【解决方案1】:

    如果客户端 hasMany 域,那么你的模型应该被称为 $this->Domain->find('all'); 显式传递字段 Client.id 将显示错误,因为它不是域表的一部分,使用 debug=2 启用 sql 转储并查看查询如何正在运行。

    你的模特应该是

    // in client.php model - having structure - id, name
    $hasMany = 'Domain';
    
    // in domain.php model - having structure - id, name, client_id
    $belongsTo = 'Client';
    

    这应该像这样工作

    $this->Domain->recursive = 1;
    $data = $this->Domain->find('all');
    // $data = Array ( 'Domain' => ********, 'Client' => ****** )
    

    【讨论】:

    • 他说他的两个表(域和客户端)在不同的数据库中——我认为他的问题是试图跨越不同的数据库。
    • 但它允许我使用属于不同表的列“Server.name”?
    【解决方案2】:

    如果您的两个表位于不同的数据库中,那么您的生活确实很困难。 AFAIK,Cake 不支持在两个不同的数据库之间连接两个表(或强制关系)。为什么将客户端表放在单独的数据库中?

    如果你不能移动你的表,我认为你将不得不在你的域模型中编写一些自定义代码,以便它将使用域的(默认)数据库连接字符串,但会实例化和连接另一个数据库资源到另一个数据库。请参阅 http://bakery.cakephp.org/articles/doze/2010/03/12/use-multiple-databases-in-one-app-based-on-requested-url 了解如何操作 - 跳到标题为“动态选择正确的数据库”的部分。

    HTH, 特拉维斯

    【讨论】:

    • 我将它们保存在另一个数据库中,因为我是从另一个网站借用它们的,我不希望有任何重复。我设法让多个数据库正常工作:var $useDbConfig = 'anotherdb';
    • 对,但我认为您不能在查询中间更改 dbConfig 变量,对吗?似乎您仍然需要创建自定义查找方法。
    • 另一种想法是让您在另一个数据库表上创建触发器。在创建/更新/删除时,触发它以镜像另一个数据库中的数据。
    • 我对多个数据库没有问题,在模型中更改 $useDbConfig 可以正常工作。我遇到的问题是能够选择我返回的列以加快速度。当我从客户表中询问列时,它说它们不存在。
    • 对,这是因为 find() 方法通常不会从单独的数据库中提取,而这正是您尝试对查询执行的操作。您需要覆盖您的 Model::find() 以便它执行此操作。我仍然建议将所有内容放在一个数据库中;除非有非常令人信服的理由,否则它会让你的生活更轻松。为什么不直接将 Cake-app 表添加到其他网站的数据库中?您可以随时根据需要删除它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 2019-10-01
    相关资源
    最近更新 更多