访问为空的左连接成员时的教义痛苦

Posted

技术标签:

【中文标题】访问为空的左连接成员时的教义痛苦【英文标题】:Doctrine pain while accessing members of a left join that are null 【发布时间】:2012-08-11 02:39:38 【问题描述】:

我的模型中有一个 Doctrine 查询,说 Model_1Table.class.php 与 Model_2 左连接。 Model_2 在多对一关系上与 Model_1 相关。 (它确实是一对一关系,而不是多对一,但架构是这样设计的)

我的查询是:

$this->select('m1.*, m2.primaryKeyOfModel2')->leftJoin('m1.model2 m2')->where('m1.record = ?', some_value);

检查 SF 调试器日志,它按应有的方式检索信息,保留 Model_1 中满足 where 子句的所有表记录,并保留 Model_2 的所有值以及那些不存在的空值。

当我想要访问此信息并根据我的表中是否存在 model_2 记录有条件地呈现信息时,痛苦就开始了。我喜欢这样:

<?php foreach($Model1Records as $Model1Record) :
          if($Model1Record->getModel2()) :
              foreach($Model1Record->getModel2() as $Model2Record):
                        //do something 
               end foreach ; 
          else: //basically checking for if(!($Model1Record->getModel2()))
              // do something else
           endif;
    endforeach ; ?>

现在基于此它应该确实可以工作,但我认为正在发生的事情是对于 model2 的 null 值它失败了。我该如何推断,因为如果我删除上述记录中的 if-else 语句并简单地使用 foreach 循环访问 Model2Record 的集合,则检索 Model2Record 中的可用行,但是它当然不会访问空值.从本质上讲,我从中获得的信息就是我通常从内部联接中获得的信息。

要提出一个问题,我如何访问 Model1 的记录,其中 Model2 记录为空值?

【问题讨论】:

【参考方案1】:

不确定模型 1 和模型 2 之间通过学说的空关系的默认返回是什么,但显然它不会返回 false,否则您会遇到 else 条件,请尝试使用“instanceof”,例如:

<?php foreach($Model1Records as $Model1Record) :

      if($Model1Record->getModel2() instanceof Model2) :

您也可以尝试将 Model1 对象转换为数组:

<?php foreach($Model1Records as $Model1Record) :

    <?php $model1 = $Model1Record->toArray();  ?>

      if(isset($model1['Model2'])) :

-- 更新--

如果它返回一个 Doctrine_Collection 实例,你应该可以这样做:

<?php foreach($Model1Records as $Model1Record) :

      if($Model1Record->getModel2()->count() > 0) :

【讨论】:

它返回一个 Doctrine Collection ;这就是为什么 else 条件从未执行过的原因;所以对于那些具有空值的人,正在呈现空集合...... instanceof Model2 将失败,因为它是一对多关系并且它返回记录集合 +1 $collection-&gt;count()(或count($collection))应该可以工作 - 问题是空的 Doctrine_Collection 仍然是一个对象,因此转换为布尔值会导致 true,而转换为布尔结果为false

以上是关于访问为空的左连接成员时的教义痛苦的主要内容,如果未能解决你的问题,请参考以下文章

使用“不为空”的左连接查询的优化

sql中的左连接和右连接

MySQL选择左连接为空的行

Symfony 2 教义左连接

如何从访问数据库中的左连接中选择excel表 - EXCEL VBA

教义 2,如何在左连接结果集中获取属性? [关闭]