DAL Range filter mit Spalte

Hallo zusammen,

für ein Plugin möchte ich beim Selektieren von Daten per addFilter einen RangeFilter hinzufügen, der dynamisch auf eine Spalte geht. Also nach dem Motto Spalte a kleiner Spalte b. Geht aber nicht, weil dann nichts selektiert wird, b wird in diesem Fall wohl als Literal behandelt.  table.b geht auch nicht. Wie bekomme ich das hin? Überall finden sich nur Beispiele mit festen Werten…

Viele Grüße,

Martin.

1 „Gefällt mir“

Wahrscheinlich brauchst du ein neues Feld. Wie ich z.B. für eines meiner Plugins

lat = $lat;
        $this->lon = $lon;
        parent::__construct($propertyName);
    }

    /**
     * @return string
     */
    public function getLat(): string
    {
        return $this->lat;
    }

    /**
     * @return string
     */
    public function getLon(): string
    {
        return $this->lon;
    }

    protected function getAccessorBuilderClass(): ?string
    {
        return DistanceFieldAccessorBuilder::class;
    }

    protected function getResolverClass(): ?string
    {
        return DistanceFieldResolver::class;
    }

    protected function getSerializerClass(): string
    {
        return DistanceFieldSerializer::class;
    }
}

 

Hallo Moorleiche,

danke für deine Antwort. Leider weiß ich noch nicht, wie ich dieses Feld dann einsetzen sollte. Um mal etwas Code-Context zu geben:

private function getFreePool(string $id, Context $context): EntityCollection {

	$criteria = new Criteria();
	$criteria->addAssociation('pool');
	$criteria->addFilter(new EqualsFilter('poolId', $id));
	$criteria->addFilter(new EqualsFilter('active', true));

	$criteria->addFilter(new RangeFilter('delivered', [RangeFilter::LT => 'pool.amount']));
	$criteria->addFilter(new RangeFilter('sold', [RangeFilter::LT => 'pool.amount']));


	var_dump($this->poolRepository->search($criteria, $context)->getEntities());die();

	return $this->poolRepository->search($criteria, $context)->getEntities();
}

Hier gibt mir das var_dump eine leere Collection zurück, obwohl die Kriterien erfüllt sind. Lasse ich die Filter delivered und sold weg, bekomme ich das richtige Ergebnis. Daher meine Annahme dass daraus quasi ein „SELECT… WHERE delivered <= ‚pool.amount‘…“ statt „SELECT… WHERE delivered <= pool.amount…“ wird.

Ich möcht einfach nur das DAL dazu bringen, das 2. SQL-Statement auszuführen…

*push*

Weiß hier niemand einen Rat?

Ich denke mal, dass das bereits gelöst wurde, aber am einfachsten ist den RangeFilter generell einmal mit den direkten Werten auszuprobieren und ansonsten erscheinen mir die Zeichen um pool.amount falsch gesetzt. Dadurch wird es ja natürlich ein String, obwohl du den Wert aus einer Variable haben willst. Weglassen und dann sollte das funktionieren.

Ich habe das selbe Problem:
Wie ist es möglich, in einem beliebigen Filter-Objekt (z.B. RangeFilter) den Wert aus zwei Datenbankspalten zu vergleichen bzw. eine Bedingung fest zu legen?

Beispiel:
Eine DateTime-Spalte soll auf einen Wert aus einer Variable (im Beispiel $now) und mit einer anderen Spalte verglichen werden.
Beide Spalten befinden sich dabei in der selben Tabelle und sind dementsprechend in der Entity Klasse vorhanden.

Die Spalte „myDateTimeColumn“ soll auf <= jetzt (=$now) geprüft werden und zusätzlich als Oder-Bedingung soll auf den Wert der Spalte „myOtherDateTimeColumn“ verglichen werden.

$now = (new DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT);
// ...
->addFilter(new MultiFilter(MultiFilter::CONNECTION_OR, [
  new RangeFilter('myDateTimeColumn', ['lte' => $now]),
  new RangeFilter('myDateTimeColumn', ['gt' => 'myOtherDateTimeColumn'])
]))
// ...

Das ist leider derzeit nicht möglich: shopware6 - Shopware 6 Data Abstraction Layer: Compare two order fields/properties with each other - Stack Overflow
Feld-Namen kann man derzeit nicht verwenden, das muss innerhalb eines SQL-Statements gelöst werden.