DAL associations filtern

tach zusammen,

ich versuche vie DAL einträge zu filter.
speziel suche ich einträge anhand vom aktuellen saleChannel und items die aktiv sind.

die tabellen sind in etwa so aufgebaut.

  • item (items mit stammdaren, wie name, acrive, position usw.)
  • item_sale_channel (beziehung von sale channel und item)

so sehen meien einträge aus, wenn ich nach allen suche.

[85c2f6809c8e4744b75941f3e0cf3ca6] => ItemsSalesChannelEntity Object
(
    [id:protected] => 85c2f6809c8e4744b75941f3e0cf3ca6
    [itemId:protected] => 8315b34b35614f7ea2471e048adc9d85
    [salesChannelId:protected] => 1a78aaa7eb4e4df8b883ed08a8220b02
    [priority:protected] => 1
    [item:protected] => ItemEntity Object
        (
            [id:protected] => 8315b34b35614f7ea2471e048adc9d85
            [active:protected] => 
            [position:protected] => 1 
            ...
        )

    [salesChannel:protected] => Shopware\Core\System\SalesChannel\SalesChannelEntity Object
        (
            [id:protected] => 1a78aaa7eb4e4df8b883ed08a8220b02
            [typeId:protected] => 8a243080f92e4c719546314b577cf82b
            [languageId:protected] => 2fbb5fe2e29a4d70aa5854ce7ce3e20b
            ...
        )
)

mein criteria sieht so aus, wenn ich nach aktive items suche:

$criteria = new Criteria();
$criteria->addAssociationPath('item')
    ->addAssociationPath('salesChannel')
    ->addFilter(new EqualsFilter(
        'item_sale_channel.salesChannelId',
        $salesChannelContext->getSalesChannel()->getId()
    ))
    ->addFilter(new EqualsFilter('item.active', true));

$result = $this->itemSaleChannelRepository->search($criteria, $salesChannelContext->getContext());

error:

[▼
  "exception" => UnmappedFieldException^ {#2358 ▼
    #parameters: [▶]
    #message: "Field "active" in entity "item" was not found."
    #code: 0
    #file: "/var/www/shopware6/platform/src/Core/Framework/DataAbstractionLayer/Dbal/EntityDefinitionQueryHelper.php"
    #line: 174
    trace: {▶}
  }
]

ist es möglich per DAL in den “associations” zu suchen?

 

Für alle, die nach dem Thema suchen:
mittels getAssociation statt addAssociation lassen sich die Associations selbst filtern

Im Beispiel von pino könnte es so funktionieren

$criteria = new Criteria();

$criteria
    ->addAssociationPath('salesChannel')
    ->addFilter(new EqualsFilter(
        'item_sale_channel.salesChannelId',
        $salesChannelContext->getSalesChannel()->getId()
    ))

$criteria->getAssociation('item')->addFilter(new EqualsFilter('active', true));

$result = $this->itemSaleChannelRepository->search($criteria, $salesChannelContext->getContext());

Unter „Filter associations“

1 „Gefällt mir“