Spaces:
No application file
No application file
namespace Mautic\PageBundle\Entity; | |
use Mautic\CoreBundle\Entity\CommonRepository; | |
use Mautic\CoreBundle\Helper\Chart\ChartQuery; | |
/** | |
* @extends CommonRepository<Trackable> | |
*/ | |
class TrackableRepository extends CommonRepository | |
{ | |
/** | |
* Find redirects that are trackable. | |
* | |
* @return mixed[] | |
*/ | |
public function findByChannel($channel, $channelId): array | |
{ | |
$q = $this->getEntityManager()->getConnection()->createQueryBuilder(); | |
$tableAlias = $this->getTableAlias(); | |
return $q->select('r.redirect_id, r.url, r.id, '.$tableAlias.'.hits, '.$tableAlias.'.unique_hits') | |
->from(MAUTIC_TABLE_PREFIX.'page_redirects', 'r') | |
->innerJoin('r', MAUTIC_TABLE_PREFIX.'channel_url_trackables', $tableAlias, | |
$q->expr()->and( | |
$q->expr()->eq('r.id', 't.redirect_id'), | |
$q->expr()->eq('t.channel', ':channel'), | |
$q->expr()->eq('t.channel_id', (int) $channelId) | |
) | |
) | |
->setParameter('channel', $channel) | |
->orderBy('r.url') | |
->executeQuery() | |
->fetchAllAssociative(); | |
} | |
/** | |
* Get a Trackable by Redirect URL. | |
* | |
* @return array | |
*/ | |
public function findByUrl($url, $channel, $channelId) | |
{ | |
$alias = $this->getTableAlias(); | |
$q = $this->createQueryBuilder($alias) | |
->innerJoin("$alias.redirect", 'r'); | |
$q->where( | |
$q->expr()->andX( | |
$q->expr()->eq("$alias.channel", ':channel'), | |
$q->expr()->eq("$alias.channelId", (int) $channelId), | |
$q->expr()->eq('r.url', ':url') | |
) | |
) | |
->setParameter('url', $url) | |
->setParameter('channel', $channel); | |
$result = $q->getQuery()->getResult(); | |
return ($result) ? $result[0] : null; | |
} | |
/** | |
* Get an array of Trackable entities by Redirect URLs. | |
* | |
* @return array | |
*/ | |
public function findByUrls(array $urls, $channel, $channelId) | |
{ | |
$alias = $this->getTableAlias(); | |
$q = $this->createQueryBuilder($alias) | |
->innerJoin("$alias.redirect", 'r'); | |
$q->where( | |
$q->expr()->andX( | |
$q->expr()->eq("$alias.channel", ':channel'), | |
$q->expr()->eq("$alias.channelId", (int) $channelId), | |
$q->expr()->in('r.url', ':urls') | |
) | |
) | |
->setParameter('urls', $urls) | |
->setParameter('channel', $channel); | |
return $q->getQuery()->getResult(); | |
} | |
/** | |
* Up the hit count. | |
* | |
* @param int $increaseBy | |
* @param bool $unique | |
*/ | |
public function upHitCount($redirectId, $channel, $channelId, $increaseBy = 1, $unique = false): void | |
{ | |
$q = $this->getEntityManager()->getConnection()->createQueryBuilder(); | |
$q->update(MAUTIC_TABLE_PREFIX.'channel_url_trackables') | |
->set('hits', 'hits + '.(int) $increaseBy) | |
->where( | |
$q->expr()->and( | |
$q->expr()->eq('redirect_id', (int) $redirectId), | |
$q->expr()->eq('channel', ':channel'), | |
$q->expr()->eq('channel_id', (int) $channelId) | |
) | |
) | |
->setParameter('channel', $channel); | |
if ($unique) { | |
$q->set('unique_hits', 'unique_hits + '.(int) $increaseBy); | |
} | |
$q->executeStatement(); | |
} | |
/** | |
* Get hit count. | |
* | |
* @param bool $combined | |
* @param string $countColumn | |
* | |
* @return array|int | |
*/ | |
public function getCount($channel, $channelIds, $listId, ChartQuery $chartQuery = null, $combined = false, $countColumn = 'ph.id') | |
{ | |
$q = $this->_em->getConnection()->createQueryBuilder() | |
->select('count('.$countColumn.') as click_count') | |
->from(MAUTIC_TABLE_PREFIX.'channel_url_trackables', 'cut') | |
->innerJoin('cut', MAUTIC_TABLE_PREFIX.'page_hits', 'ph', 'ph.redirect_id = cut.redirect_id AND ph.source = cut.channel AND ph.source_id = cut.channel_id'); | |
$q->where( | |
'cut.channel = :channel' | |
)->setParameter('channel', $channel); | |
if ($channelIds) { | |
if (!is_array($channelIds)) { | |
$channelIds = [(int) $channelIds]; | |
} | |
$q->andWhere( | |
$q->expr()->in('cut.channel_id', $channelIds) | |
); | |
} | |
if ($listId) { | |
if (!$combined) { | |
$q->innerJoin('ph', MAUTIC_TABLE_PREFIX.'lead_lists_leads', 'cs', 'cs.lead_id = ph.lead_id'); | |
if (true === $listId) { | |
$q->addSelect('cs.leadlist_id') | |
->groupBy('cs.leadlist_id'); | |
} elseif (is_array($listId)) { | |
$q->andWhere( | |
$q->expr()->in('cs.leadlist_id', array_map('intval', $listId)) | |
); | |
$q->addSelect('cs.leadlist_id') | |
->groupBy('cs.leadlist_id'); | |
} else { | |
$q->andWhere('cs.leadlist_id = :list_id') | |
->setParameter('list_id', $listId); | |
} | |
} else { | |
$subQ = $this->getEntityManager()->getConnection()->createQueryBuilder(); | |
$subQ->select('distinct(list.lead_id)') | |
->from(MAUTIC_TABLE_PREFIX.'lead_lists_leads', 'list') | |
->andWhere( | |
$q->expr()->in('list.leadlist_id', array_map('intval', $listId)) | |
); | |
$q->innerJoin('ph', sprintf('(%s)', $subQ->getSQL()), 'cs', 'cs.lead_id = ph.lead_id'); | |
} | |
} | |
if ($chartQuery) { | |
$chartQuery->applyDateFilters($q, 'date_hit', 'ph'); | |
} | |
$results = $q->execute()->fetchAllAssociative(); | |
if ((true === $listId || is_array($listId)) && !$combined) { | |
// Return array of results | |
$byList = []; | |
foreach ($results as $result) { | |
$byList[$result['leadlist_id']] = $result['click_count']; | |
} | |
return $byList; | |
} | |
return (isset($results[0])) ? $results[0]['click_count'] : 0; | |
} | |
public function getTableAlias(): string | |
{ | |
return 't'; | |
} | |
} | |