【问题标题】:Yii cdbcriteria select a relation's columnsYii cdbcriteria 选择关系的列
【发布时间】:2012-02-19 14:30:24
【问题描述】:

我很难在 Yii 中给出的博客演示中选择所有帖子的用户名..

作者是帖子类与用户的关系...

$criteria = new CDbCriteria;
$criteria->with='author';
$criteria->select='author.username';
$dataProvider=new CActiveDataProvider('Post', array(
    'criteria' => $criteria,
));
var_dump($dataProvider->getData());

错误:

活动记录“Post”正在尝试选择无效列“author.username”。注意,该列必须存在于表中或者是带有别名的表达式。

【问题讨论】:

    标签: php yii


    【解决方案1】:

    with 所做的是eager loading..这意味着关系的数据 还将从数据库中加载,以及何时调用 关系,不会有实际的查询..

    select 的作用是从数据库中选择它并将其映射到模型 变量..

    现在你的情况是你试图在select中写一些关系的列,即使没有写它也会在select中出现,但是因为没有对应的变量来映射这个值yii是抛出错误..

    所以首先如果你需要 auther 的用户名作为响应,你可以通过关系调用来获取它,这不会是数据库调用,你不需要写一个 select..

    如果您只想将用户名作为帖子模型的一部分调用您必须将其声明为模型中的属性,然后在选择中指定别名..

    $criteria = new CDbCriteria;
    $criteria->with='author';
    $criteria->select='author.username as auther_username';
    $dataProvider=new CActiveDataProvider('Post', array(
        'criteria' => $criteria,
    ));
    var_dump($dataProvider->getData());
    

    并在您的 Post 模型中声明..

    public $auther_username;
    

    现在它不会抛出错误了,您可以通过两种方式访问​​用户名..$post->auther_username$post->auther->username

    【讨论】:

    • 我不是在指责,但如果您投了反对票,请解释原因?因为我看不出我的方法有什么问题(你的方法也没有)。
    • 所以,这似乎就是 op 想要的,+1
    【解决方案2】:

    试试这个:

    $criteria = new CDbCriteria;
    $criteria->with=array('author'=>array('select'=>'username'));
    
    // you can still select Post table columns here
    $criteria->select='post_content';
    
    $dataProvider=new CActiveDataProvider('Post', array(
       'criteria' => $criteria,
    ));
    var_dump($dataProvider->getData());
    

    【讨论】:

    • 同?该标准肯定有效。让我知道哪一行代码给了你同样的结果。
    • 几天前有人投票了!然后有人在几个小时前投了反对票!所以downvoter,如果你读到这个,请解释你的原因,因为我的代码和我的方法没有任何问题。如果需要,也许我可以改进答案。建设性的批评总是受欢迎的
    • 对于 yr downvote...如果你注意到用户要求select usernames of all posts..他显然可以通过关系调用 $post->user->username, all @987654323 @ 帮助是它使它急切加载..所以现在这意味着用户需要的是获取用户名,而不调用关系,在他想要的同一个 var_dump 中,你的答案根本没有提供..
    • 现在让我们谈谈您的答案提供的内容。它所说的是将 select 放入其中,在这种情况下没有相关性。它实际上意味着在加载作者关系的数据时,只加载列称为用户名..顺便说一句,这是一个无错误的代码,但他仍然无法在不调用关系的情况下获得用户名..即使不做选择的事情他也可以做​​到......而且你不解释为什么错误正在发生..所以简而言之,你的答案提供的是一种没有错误的方法,也没有需要的东西..现在我希望能解释自己..
    • 首先感谢您的回复,大多数人在被问及是否投反对票时不会发表评论/回复。现在回答,如果是这样,你理解了这个问题,那么我明白你的观点,也明白你的答案。但是让我解释一下我的答案,第一个提问者没有提到他/她想要访问用户名的任何地方如何,所以我没有做任何假设。其次只选择作者的用户名,而不是在dbcriteria的选择中传递author.username,我们可以在with中的关系标准中传递它,这就是我的回答。
    【解决方案3】:

    试试这个:

    $criteria = new CDbCriteria;
    $criteria->with=array('author'=>array('select'=>'username'));
    $dataProvider=new CActiveDataProvider('Post', array(
        'criteria' => $criteria,
    ));
    var_dump($dataProvider->getData());
    

    来源:CActiveRecord.with

    为了即时自定义选项,我们应该传递一个数组 with() 方法的参数。数组键是关系名称,并且 数组值是对应的查询选项。

    【讨论】:

      猜你喜欢
      • 2014-11-14
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      • 2018-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多