【问题标题】:findAll() where not in table YiiframeworkfindAll() 不在表 Yiiframework 中
【发布时间】:2014-05-12 12:53:30
【问题描述】:

他在那里,

我的数据库中有两个表:“Achievements”和“AchievementsCompleted”。我想选择所有的成就,除非有一个以该成就作为外键约束的成就完成条目。

例如:

成就表共有3行:

  • ID:1 - 成就1
  • ID:2 - 成就2
  • ID:3 - 成就3

表AchievementCompleted中有一个条目:

  • achievement_id = 2 由用户 3 完成

在这种情况下,我希望输出仅为用户 3 的 id 1 和 3 的模型。

$criteria = new CDbCriteria();
$criteria->condition = "";
$models = Achievements::model()->findAll($criteria);

提前致谢!我希望这是有道理的。

【问题讨论】:

  • 检查 join relation with 的 cdbcriteria 文档
  • 你能给我举个例子吗? imo 文档太模糊了。谢谢。
  • 您可以尝试编写自己的查询并使用 findAllBySql()

标签: php sql yii models


【解决方案1】:

试试这个

$criteria = new CDbCriteria;
$criteria->join ='INNER JOIN AchievementsCompleted';
$criteria->condition = "AchievementsCompleted.achievement_id != Achievements.id";
$models = Achievements::model()->findAll($criteria);

【讨论】:

    【解决方案2】:

    您需要使用 RIGHT JOIN:

    您将获得所有未“完成”的成就:

       $criteria=new CDbCriteria;
       $criteria->join='RIGHT JOIN Achievements ON AchievementsCompleted.Achievement_id=Achievements.id';
       $models = AchievementsCompleted::model()->findAll($criteria);
    

    您需要将表格列替换为您自己的列(“Achievement_id”和“id”)。

    这是一个解释 SQL 连接如何工作的可视化图表: What's the difference between INNER JOIN, LEFT JOIN, RIGHT JOIN and FULL JOIN?

    【讨论】:

    • He Wissam,这实际上给了我一个已完成成就的列表。我怎样才能把它转成一个未完成的成就列表?谢谢!根据您的示例,这就是我所拥有的: $criteria=new CDbCriteria; $criteria->join='RIGHT JOIN tbl_achievements ON t.achievement_id=tbl_achievements.id'; $criteria->condition = 'user_id = ' 。 Yii::app()->user->id; $models = AchievementsCompleted::model()->findAll($criteria);
    猜你喜欢
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多