Je récupère une collection de produits et je souhaite utiliser une condition similaire sur un attribut personnalisé, mais le problème est que tout en utilisant une condition similaire, je souhaite supprimer tous les espaces blancs contenus dans la valeur de mon attribut personnalisé.
J'ai déjà essayé
$psku = 'some_sku'; $_product = Mage::getModel('catalog/product')->getCollection(); $_product->addFieldToFilter(str_replace(' ', '', 'simple_skus_map'), array(array('like' => '%,'.$psku.',%'), array('like' => '%,'.$psku), array('like' => $psku.',%'), array('like' => $psku) ));
// simple_skus_map: (mon attribut personnalisé a des données comme un, deux, trois, quatre). et je veux que le code suivant récupère tout le produit qui simple_skus_map contient l'un des mots mentionnés ci-dessus (c'est-à-dire un / deux / trois / quatre) REMARQUE: remarqué? J'ai des espaces dans mon attribut personnalisé.
3 Réponses :
La requête que vous avez fournie peut être lente, car elle utilise comme avec les jokers. Vous pouvez utiliser find_in_set a > fonctionnalité. Heureusement, magento le prend également en charge: $_product = Mage::getModel('catalog/product')->getCollection();
// Trim spaces, 'save to column' trimmed_simple_skus_map
$_product->addExpressionAttributeToSelect('trimmed_simple_skus_map', 'REPLACE(sku,\' \',\' \')', 'simple_skus_map');
// Find in trimmed set
$_product->addFieldToFilter('trimmed_simple_skus_map', [
'finset' => [$psku]
]
);
bonjour Paul, merci pour votre aide, je voulais filtrer mon attribut personnalisé donc je viens de modifier votre code et j'ai obtenu le résultat comme requis. Voici mon code: $ _product = Mage :: getModel ('catalogue / produit') -> getCollection (); $ _product-> addExpressionAttributeToSelect ('trimmed_simple_sk us_map', 'REPLACE ({{simple_skus_map}}, \' \ ', \' \ ')', 'simple_skus_map'); $ _product-> addFieldToFilter ('trimmed_simple_skus_map', ['finset' => [$ psku]]);
J'ai une autre solution, avec des requêtes SQL directes. voici le code php:
$resource = Mage::getSingleton('core/resource'); $readConnection = $resource->getConnection('core_read'); $writeConnection = $resource->getConnection('core_write'); $q_find_blank = "SELECT *FIELD_NAME* FROM simple_skus_map WHERE *FIELD_NAME* LIKE '% %'; "; $results = $readConnection->fetchAll($q_find_blank); //get all field with a blank space foreach ($results as $result){ //set all the fields in array and removes the blanks $result = explode(' ',$result); $no_blanks_fields[] = implode("",$result); } echo print_r($no_blanks_fields); foreach ($no_blanks_fields as $no_blanks_field){ //replace them in the database field echo $no_blanks_field . "<br>"; $q_update = "UPDATE simple_skus_map set *FIELD_NAME* = ".$no_blanks_field." WHERE *condition referencing the right field to his value*"; $writeConnection->query($q_update); }
ce n'est tout simplement pas très performant, mais ça marche. N'oubliez pas que lorsque vous écrivez des données, assurez-vous de définir la valeur correcte dans les champs appropriés (vous pouvez peut-être créer une table de support temporaire, avec | field | id |).
Cela supprimera vos blancs de la sélection et remplacez-les par une valeur non vide (ou ce avec quoi vous voulez les imploser, vérifiez simplement la fonction imploser).
"test field blanks" => "testfieldsblanks"
p>
pour l'attribut personnalisé, vous pouvez faire comme suit, par conséquent, il supprimera l'espace blanc de votre valeur d'attribut personnalisé et correspondra aux données / post données
$_product = Mage::getModel('catalog/product')->getCollection(); $_product->addExpressionAttributeToSelect('trimmed_simple_skus_map', 'REPLACE({{simple_skus_map}},\' \',\'\')','simple_skus_map'); $_product->addFieldToFilter('trimmed_simple_skus_map', [ 'finset' => [$psku] ] );