web-dev-qa-db-fra.com

Sélection des données de 2 tables et insertion dans une 3ème table

Quelqu'un pourrait-il m'aider à créer une requête à l'aide de l'API Joomla? J'ai tourné en rond.

Ce que j'ai jusqu'ici:

<?php
// Get a db connection.
$db = JFactory::getDbo();

// Create a new query object.
$query = $db->getQuery(true);

// Insert columns.
$columns = array('virtuemart_media_id', 'virtuemart_product_id');

// Insert values.
$values = array(); <---- How can i get the values

// Prepare the insert query.
$query
    ->insert($db->quoteName('#__virtuemart_product_medias'))
    ->columns($db->quoteName($columns))
    ->values(implode(',', $values));

// Set the query using our newly populated query object and execute it.
$db->setQuery($query);
$db->execute();

?/>

Maintenant, les valeurs que je veux sont basées sur ce qui suit:

  • virtuemart_media_id = #__virtuemart_medias.virtuemart_media_id
  • virtuemart_product_id = #__virtuemart_products.virtuemart_product_id
  • O #__virtuemart_products.product_sku = #__virtuemart_medias.explode("-", strtoupper('file_url'), 2)

Je veux insérer les valeurs dans la table #__virtuemart_product_medias.

1
Dtorr1981

avez-vous vraiment besoin de le traiter avec php? 1 requête et MySQL fera tout cela très vite

insert into #__table3 (column1, column2)

select column1, column2

tout en une requête et vous pouvez utiliser n'importe quelle jointure et je crois même union (l'union n'est pas testée)

vous pouvez aussi construire cette requête avec joomla

et c'est tout. pas de boucle nécessaire. testé - l'efficacité est au moins 2500 fois plus rapide :) (test de migration de données réel)

2
Alexandr

La fonction éclatée renvoie un tableau. votre premier code n'a aucun sens pour moi; et je connais bien les tables virtuemart; Obtenir le file_url de la requête, je ferais:

//Select just the product sku from the file url
$query = $db->getQuery(true);
$query->select($db->qn(array('file_url')))
  ->from($db->qn('#__virtuemart_medias'));
$db->setQuery($query);
$object =  $db->loadObjectList();

La grande question est: que voulez-vous obtenir des tables virtuemart? Dans le second code, il n'y a pas de virtuemart_product_id ni de product_sku dans la table virtuemart_medias.

Je veux obtenir le product_id de virtuemart_products, basé sur le sku de file_url, puis insérer les propriétés virtumart_media_id et virtuemart_product_id dans la table virtuemart_product_medias. Lier efficacement tous les fichiers multimédias avec le même produit au produit lui-même.

//this is e.g. the file-url:
$file-url = '/blabla/stock/knife/picture1.png'; 
$path_parts = pathinfo($file-url);
//get the last dir (i.e.knife)
$skus = explode('/',path_parts['dirname']); // explodes /blabla/stock/knife
$product_sku = array_pop($skus); //here you've to proof if its empty..
if (empty($product_sku)) return false;
$filename = path_parts['basename']; //picture1.png
$db = JFactory::getDbo();
$query = $db->getQuery(true)
  ->select($db->qn(array('virtuemart_product_id','product_sku')))
  ->from($db->qn('#__virtuemart_products'))
  ->where($db->qn('product_sku').' = '.$db->q($product_sku));
$product = $db->loadObject();

vous devez ensuite insérer le fichier dans la table #__virtuemart_medias, obtenir le virtuemart_media_id à partir de l'insertion; et ensuite, vous devez insérer la relation dans la table #__ virtuemart_product_medias ... bonne chance. Je pense qu'un bon début est ici: https://docs.joomla.org/Inserting,_Updating_and_Removing_data_using_JDatabase vous pouvez également utiliser des objets avec la classe JTable dans Joomla.

0
Tom Kuschel