# DAL Range filter mit Spalte

**URL:** <https://forum.shopware.com/t/dal-range-filter-mit-spalte/72770>\
**Category:** Programmierung\
**Created:** [14. Februar 2021 um 20:05 UTC](https://forum.shopware.com/t/dal-range-filter-mit-spalte/72770 "2021-02-14T20:05:51Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![mrtnmueller](https://avatars.discourse-cdn.com/v4/letter/m/3be4f8/32.png) [@mrtnmueller](https://forum.shopware.com/u/mrtnmueller)\
**Post date:** [14. Februar 2021 um 20:05 UTC](https://forum.shopware.com/t/dal-range-filter-mit-spalte/72770/1 "2021-02-14T20:05:51Z")

</div>

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.&nbsp; table.b geht auch nicht. Wie bekomme ich das hin? Überall finden sich nur Beispiele mit festen Werten…

Viele Grüße,

Martin.

---

<div class="post-metadata">

**Author:** ![Moorleiche](https://avatars.discourse-cdn.com/v4/letter/m/6f9a4e/32.png) [@Moorleiche](https://forum.shopware.com/u/Moorleiche)\
**Post date:** [15. Februar 2021 um 01:51 UTC](https://forum.shopware.com/t/dal-range-filter-mit-spalte/72770/2 "2021-02-15T01:51:34Z")

</div>

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;
    }
}

```

&nbsp;

---

<div class="post-metadata">

**Author:** ![mrtnmueller](https://avatars.discourse-cdn.com/v4/letter/m/3be4f8/32.png) [@mrtnmueller](https://forum.shopware.com/u/mrtnmueller)\
**Post date:** [15. Februar 2021 um 06:56 UTC](https://forum.shopware.com/t/dal-range-filter-mit-spalte/72770/3 "2021-02-15T06:56:44Z")

</div>

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…

---

<div class="post-metadata">

**Author:** ![mrtnmueller](https://avatars.discourse-cdn.com/v4/letter/m/3be4f8/32.png) [@mrtnmueller](https://forum.shopware.com/u/mrtnmueller)\
**Post date:** [20. Februar 2021 um 06:59 UTC](https://forum.shopware.com/t/dal-range-filter-mit-spalte/72770/4 "2021-02-20T06:59:34Z")

</div>

\*push\*

Weiß hier niemand einen Rat?

---

<div class="post-metadata">

**Author:** ![KaleAndMe](https://avatars.discourse-cdn.com/v4/letter/k/b3f665/32.png) [@KaleAndMe](https://forum.shopware.com/u/KaleAndMe)\
**Post date:** [24. August 2021 um 13:54 UTC](https://forum.shopware.com/t/dal-range-filter-mit-spalte/72770/5 "2021-08-24T13:54:26Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![stormerMike](https://avatars.discourse-cdn.com/v4/letter/s/e0b2c6/32.png) [@stormerMike](https://forum.shopware.com/u/stormerMike)\
**Post date:** [22. Juni 2022 um 12:38 UTC](https://forum.shopware.com/t/dal-range-filter-mit-spalte/72770/6 "2022-06-22T12:38:16Z")

</div>

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.

```auto
$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'])
]))
// ...

```

---

<div class="post-metadata">

**Author:** ![m\_arcus\_m](https://avatars.discourse-cdn.com/v4/letter/m/848f3c/32.png) [@m\_arcus\_m](https://forum.shopware.com/u/m_arcus_m)\
**Post date:** [17. Juli 2023 um 11:48 UTC](https://forum.shopware.com/t/dal-range-filter-mit-spalte/72770/7 "2023-07-17T11:48:38Z")

</div>

Das ist leider derzeit nicht möglich: [shopware6 - Shopware 6 Data Abstraction Layer: Compare two order fields/properties with each other - Stack Overflow](https://stackoverflow.com/questions/76703433/shopware-6-data-abstraction-layer-compare-two-order-fields-properties-with-each)  
Feld-Namen kann man derzeit nicht verwenden, das muss innerhalb eines SQL-Statements gelöst werden.
