【问题标题】:Using an existing relation HAS-MANY on a criteria在标准上使用现有关系 HAS-MANY
【发布时间】:2012-10-03 15:21:16
【问题描述】:

我在使用自定义函数从我的数据库中搜索特定数据时遇到了一些问题。

我有 TableA(id,....) 和 TableB(id, tablea_id, userid,...)

Model TableA 的关系码如下:

'relation_name' => 数组(self::HAS_MANY, 'TableB', 'tablea_id')

我需要创建一个自定义函数来查询 TableA 并给我存在于 TableA 上的结果,这些结果包含 TableB 数据上的某个用户 ID,而且 TableB 与来自 tablea_id 字段的 TableA 相关。

我使用以下代码找到了我的问题的解决方案:

        public function findABCD($user_id)
    {
              $criteria=new CDbCriteria;
              $criteria->join = 'left join TableB on t.id=TableB.tablea_id';
              $criteria->condition = "TableB.userid = ".$user_id;
              return new CActiveDataProvider($this, array(
                      'criteria'=>$criteria,
              ));
    } 

这可行,但我没有利用我之前创建的关系。 关于我需要使用什么的任何想法?

我测试了很多东西,但收到 SQL 错误。

这是我之前测试过的(而不是条件 Join 和 Condition):

$criteria->with=array('relation_name');
$criteria->condition = "relation_name.userid= ".$user_id;
//this does not work as well
//$criteria->condition = "TableB.userid= ".$user_id;

错误是这样的:

SQL: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'relation_name.userid' in 'where clause'.

有什么想法吗?

【问题讨论】:

  • 您真的应该阅读Yii documentation,了解如何正确转义您的 SQL 查询。你在这里做的事情非常危险。
  • 这只是一个示例,但如果您要求我对我的用户 ID 进行适当的验证,我也不允许任何用户删除/编辑我不想删除的内容。但那是另一回事了。谢谢你的信息顺便说一句。对我面临的问题有什么想法吗?
  • 调试 ORM 非常困难,除非您有正在执行的实际查询的日志。看起来您的 with 呼叫未按预期加入表格。
  • 我的意思是 Yii 有一个工具可以正确地转义你应该使用的值。对可能由用户提供的值(例如查询字符串参数)进行字符串连接是在与灾难调情。 array("TableB.userid" => $user_id)"TableB.userid = ".$user_id 好很多。
  • 是的,你是对的!谢谢你的帮助。

标签: php mysql yii


【解决方案1】:

我使用 ActiveRecord 查询进行这种连接,不确定它是否适用于 CActiveDataProvider:

$criteria->with = array(
    'relation_name' => array(
        'joinType' => 'INNER JOIN',
        'on'       => 'user_id = :user_id',
        'params'   => array( 'user_id' => $userId )
    )
);

$criteria->together = true;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    相关资源
    最近更新 更多