我试图创建一个对象,能够处理查询样条件语句。这是这样我就可以“加入”两个条件,共同打造基于正在使用的“加入”类型它们之间的依赖关系。我现在有一个简单的对象,其中包含以下方法:

public function addCondition ( Condition $condition, $join = null )
{
    $this->conditions[] = $condition;
}

public function validate ( )
{
    foreach ( $this->conditions as $condition )
    {
        $result = $condition->validate( );
        [...]
    }
}

的问题是,我需要能够执行两个语句,这将影响到验证方法的返回值之间的条件加入。这个想法是,你如下可以提供一个条件:

$this->addCondition($condition_1);
$this->addCondition($condition_2, 'AND');
$this->addCondition($condition_3, 'NOT');

这将随后生成指定该第三条件的结果将向后链以影响所述第一条件的结果所需要的逻辑。

在该示例中,可以说:

condition_1 = Apple is Red
condition_2 = Apple is Ripe
condition_3 = Apple is Golden Delicious

使用本我应该假设如果我是通过一个成熟的,红色和金色美味苹果,验证的结果()将是假的。该方法应该失败,因为“加入”对condition_3不是

但是,在目前还没有告诉整个方法的结果依赖于前面的条件,它被连接到它的方式的结果的代码的方式。

任何帮助是非常感谢!感谢。

有帮助吗?

解决方案

把逻辑在你的病情的子类。

创建Condition_And类采用两个(或多个)条件的对象且仅当它们都为真。

,则返回true

创建Condition_Or类带有两个(或更多个)条件对象并返回false,如果任何为真。

创建Condition_Not类,如果你觉得这是必要的(苹果是不是金冠)。

一起串起这些都应该得到你正在寻找任何查询。由于它们是相同类型的所有子类,你可以建立他们把组合这些OR的内部与运算的内部OR的等内。

其他提示

同时涉及ANDOR条件句固有嵌套。您的类似乎并不具有一种方式来表达这一点。

没有嵌套意味着你的条件必须要么全部与AND接合,或全部OR接合。在任何情况下 - 你不能在同一时间使用两种

有关你的榜样,AND似乎是自然的选择,因此,所有你需要的是每个条件的NOT标志:

$this->addCondition($condition_1, true);   // e.g.: must be true to succeed
$this->addCondition($condition_2, true);
$this->addCondition($condition_3, false);  // e.g.: must be false to succeed

您会然后执行:

$valid = true;

foreach ( $this->conditions as $condition )
{
  $valid = $valid && $condition->validate();
  if (!$valid) 
  {
    // react to "validation failed at $condition"
  }
}

return $valid;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top