I am trying to obtain value of a custom field of a product. I only have ID of that product. I know title of the custom field.
How can I get value of that custom field?
Please help.
PS: I know PHP well but I am new to Joomla/Virtuemart.
This will work for VM2.x
VM is storing the custom field values in #__virtuemart_customs
The relation between the product and the custom field is maintaining in the #__virtuemart_product_customfields
You have title and Product Id so you can try this
$db = &JFactory::getDBO();
$sql = "SELECT F.custom_value #__virtuemart_customs AS C LEFT JOIN #__virtuemart_product_customfields AS F ON F.virtuemart_customfield_id = C.virtuemart_custom_id where (C.custom_title='$your_customtitle' and F.virtuemart_product_id = '$product_id')";
$db->setQuery($sql);
$db->query();
$res = $db->loadAssoc();
echo $res['custom_value'];
Also you try with inner sub query .
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('virtuemart_product_id,custom_value');
$query->from('#__virtuemart_product_customfields');
$db->setQuery((string)$query);
$results = $db->loadObjectList();
if ($results){
foreach($results as $result)
{
// do your stuff here
}
Related
I'm working with Opencart 3.0 to set up a product cross-sell to display similar items to the user when they add something to the cart. I thought I had seen a pattern with the array of products in the cart that put the last item of cart at the end. So my php looked something like this:
$this->load->model('catalog/product');
$related_product_id = $products;
$related_product_id = end($related_product_id);
$related_product_id = $related_product_id['product_id'];
$related = $this->model_catalog_product->getProductRelated($related_product_id);
foreach ($related as $related) {
//..do something
}
Using the end() method in the above code would take the very last Key=>Value (Product_id) in the array so I could use it to display the product on the page.
This worked for a while until I noticed that it was not always accurate. If someone added something already in the cart, it wouldn't place it at the end of the array, and also other certain products for some reason didn't show up at the end of the array.
Is there another way to get the Product_Id of the last item a user added to the cart than the way I'm going about it? My way doesn't seem very consistent. Thanks!
I was able to figured it out adding my own function to /system/libray/cart/cart.php
I added this function
public function getProductsInCart() {
$product_data = array();
$cart_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "cart WHERE api_id = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND customer_id = '" . (int)$this->customer->getId() . "' AND session_id = '" . $this->db->escape($this->session->getId()) . "' ORDER BY date_added ASC");
foreach ($cart_query->rows as $cart) {
$product_data[] = array(
'cart_id' => $cart['cart_id'],
'product_id' => $cart['product_id'],
'date_added' => $cart['date_added'],
);
}
return $product_data;
}
And instead of using the $this->cart->getProducts() line to get products from the cart, I'm using my new function $this->cart->getProductsInCart().
This works way more consistent. The only thing it doesn't take into consideration is when someone goes back to a product already added. It doesn't count it as a new product added, but instead just updates it quantity.
Let me know if someone finds a better solution.
I'm playing with Doctrine, and I think I probably miss something.
So I have a table for some relations, and here is the columns:
id | user_id | workshop_id
Basically, I use this table to know that a user is register for a workshop.
I want to count how many users subscribe for a workshop.
So in my Repository, I use a DQL request:
/** #var EntityManager $entityManager */
$entityManager = $this->getEntityManager();
$query = $entityManager->createQuery("
SELECT COUNT('uw.id')
FROM App\Entity\UserWorkshops AS uw
LEFT JOIN App\Entity\User AS u WITH u.userId = uw.user
WHERE uw.workshop = :workshop_id");
$count = $query
->setParameters(['workshop_id' => $workshopId])
->getResult();
And here, and example of the result:
I just need to retrieve 3, as an integer.
How can I return something different ?
thanks
You can use getSingleScalarResult, from the doc:
Query#getSingleScalarResult(): Retrieves a single scalar value from
the result returned by the dbms. If the result contains more than a
single scalar value, an exception is thrown. The pure/mixed
distinction does not apply.
As example:
$count = $query
->setParameters(['workshop_id' => $workshopId])
->getSingleScalarResult();
I have some One-To-Many, unidirectional with Join Table relationships in a Symfony App which I need to query and I can't figure out how to do that in DQL or Query Builder.
The Like entity doesn't have a comments property itself because it can be owned by a lot of different types of entities.
Basically I would need to translate something like this:
SELECT likes
FROM AppBundle:Standard\Like likes
INNER JOIN comment_like ON comment_like.like_id = likes.id
INNER JOIN comments ON comment_like.comment_id = comments.id
WHERE likes.created_by = :user_id
AND likes.active = 1
AND comments.id = :comment_id
I've already tried this but the join output is incorrect, it selects any active Like regardless of its association with the given comment
$this->createQueryBuilder('l')
->select('l')
->innerJoin('AppBundle:Standard\Comment', 'c')
->where('l.owner = :user')
->andWhere('c = :comment')
->andWhere('l.active = 1')
->setParameter('user', $user)
->setParameter('comment', $comment)
I see 2 options to resolve this:
Make relation bi-directional
Use SQL (native query) + ResultSetMapping.
For the last option, here is example of repository method (just checked that it works):
public function getLikes(Comment $comment, $user)
{
$sql = '
SELECT l.id, l.active, l.owner
FROM `like` l
INNER JOIN comment_like ON l.id = comment_like.like_id
WHERE comment_like.comment_id = :comment_id
AND l.active = 1
AND l.owner = :user_id
';
$rsm = new \Doctrine\ORM\Query\ResultSetMappingBuilder($this->_em);
$rsm->addRootEntityFromClassMetadata(Like::class, 'l');
return $this->_em->createNativeQuery($sql, $rsm)
->setParameter('comment_id', $comment->getId())
->setParameter('user_id', $user)
->getResult();
}
PS: In case of Mysql, 'like' is reserved word. So, if one wants to have table with name 'like' - just surround name with backticks on definition:
* #ORM\Table(name="`like`")
I find the Symfony documentation very poor about unidirectional queries.
Anyway I got it working by using DQL and sub-select on the owning entity, which is certainly not as fast. Any suggestion on how to improve that is more than welcomed!
$em = $this->getEntityManager();
$query = $em->createQuery('
SELECT l
FROM AppBundle:Standard\Like l
WHERE l.id IN (
SELECT l2.id
FROM AppBundle:Standard\Comment c
JOIN c.likes l2
WHERE c = :comment
AND l2.owner = :user
AND l2.active = 1
)'
)
->setParameter('user', $user)
->setParameter('comment', $comment)
;
I've table like: product_id->name,description, price
I want to retrieve all products, so this is my code for retrieve products
$doc = $this->getDoctrine();
$em = $doc->getEntityManager();
$conn = $em->getConnection();
$repo = $doc->getRepository('AppBundle:Products');
$query = $repo->createQueryBuilder('p')->getQuery();
$sql = $query->getSql();
$stmt = $conn->prepare($sql);
$stmt->execute();
$products = $stmt->fetchAll(\PDO::FETCH_ASSOC);
Problem is when building a query it's always add column index suffix after column name as alias
So results is going to be like:
[
{"product_id_0":"1","name_1":"Name1","description_2":"Desc1","price_3":"100"},
{"product_id_0":"2","name_1":"Name2","description_2":"Desc2","price_3":"200"}
]
Notice their are suffix like _0, _1 after column name that I don't want it,
How can I build query without alias like that?
You've already got a repository.
When you have a repository, you do not need to create raw SQL queries or even use the created ones. Let Doctrine take care of that (this is the DBAL, Doctrine's database abstraction layer).
Instead, use a method like findAll() or findBy() to get objects.
Example:
$repo = $doc->getRepository('AppBundle:Products');
$results = $repo -> findAll();
// Returns array(Product, Product, ...), which should be mapped to an entity
// so that you can use $product -> getName() or whatever you need.
You can also create a query to get an array result:
$results = $repo -> createQueryBuilder('p') -> getQuery() -> getArrayResult();
Documentation: http://symfony.com/doc/current/book/doctrine.html
I'm using SubSonic 3 as my OR mapper in the project. My problem is that the query SubSonic generates for select and other operations is like:
var repo = GetRepo();
var results = repo.GetAll();
And this would make select * from the entity, but I have to select only Id and Title from the table. I don't have permission to select * on the table
There isn't much to go off of and you probably solved this problem already but just in case someone else has the same question, here's my 2 cents.
If you just wanted to select Id and Title you could do one of the following.
I'm guessing you're using ActiveRecord.
//results in a list of anonymous objects with Id and Title
var results = (from r in YourTable.All() select new { Id = r.Id, Title = r.Title }).ToList();
If you're using AdvancedTemplate, then you could do
//create an instance of the db schema
var repo = new SubSonic.AdvancedTemplate.YourDatabase();
//results in a list of anonymous objects with Id and Title
var results = (from r in repo.YourTable select new { Id = r.Id, Title = r.Title }).ToList();