PHP: Bir nesnenin içinde bir pseudo-join yöntemi oluşturma

2 Cevap php

Ben sorgu gibi koşullu ifadeler taşıma kapasitesine sahip bir nesne oluşturmak için çalışıyorum. Bu yüzden kullanılan 'birleştirme' türüne dayalı aralarında bir bağımlılık oluşturmak için iki şart 'birleştirme' olduğunu. Şu anda aşağıdaki yöntemleri içeren basit bir nesne var:

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

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

Sorun şu ki, ben bir koşullu iki tablo arasında birleştirme gerçekleştirmek gerekiyor, bu doğrulama yönteminin dönüş değerini etkileyecektir. Fikir aşağıdaki gibi bir durum kaynağı olmasıdır:

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

Bu daha sonra üçüncü durumun sonuçları geriye zincir İlk durumun sonuçlarını etkileyecek olacağını belirtmek için gerekli mantığı oluşturmak istiyorsunuz.

Örnekte, Diyelim ki:

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

Bu kullanma Ben, olgun kırmızı ve altın lezzetli elma, validate sonucu geçmesi için ise () yanlış olacağını varsayıyorum gerekir. Için 'birleştirme' condition_3 değildir, çünkü yöntem başarısız gerekir.

Ancak, şu anda, tüm yöntemin sonucu önceki durumuna ve buna birleştirilen bir şekilde sonucu bağlıdır kodu anlatan hiçbir yolu yoktur.

Herhangi bir yardım büyük beğeni topluyor! Teşekkürler.

2 Cevap

Lütfen Durumu altsınıflarda mantığı koydu.

Iki (veya daha fazla) Durum nesneleri alır ve her ikisi de doğru olduğunda true döndüren bir Condition_And sınıf oluşturmak.

Iki (veya daha fazla) Durum nesneleri alır ve herhangi bir doğruysa false döndüren bir Condition_Or sınıf oluşturmak.

Eğer (Apple Golden Delicious değildir) gerekli olduğunu düşünüyorsanız bir Condition_Not sınıf oluşturmak.

Birlikte bu çekimi size aradığınız herhangi bir sorgu almalısınız. Onlar aynı türdeki tüm alt sınıfları olduğuna göre, böylece ameliyathanelerinde ve iç Eleştiri inside ameliyathanelerinde içinde fakirler koyarak onları kurabilirsiniz.

Her iki AND ve OR içeren Şartlı doğal olarak iç içe. Sınıf bu ifade bir yol var görünmüyor.

Resim iç içe da koşullar her AND ile birleştirilmesi gerekir, ya tüm OR ile birleştirilebilir olduğu anlamına gelir. Her durumda - Eğer aynı anda hem kullanamazsınız.

Lütfen Örneğin, AND doğal seçim, böylece ihtiyacınız olan tüm her koşul için bir NOT bayrağı görünüyor:

$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

Daha sonra yapardı:

$valid = true;

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

return $valid;