where('subscriber_id', $subscriber_id) ->where('newsletter_id', $newsletter_id) ->where('queue_id', $queue_id) ->findOne(); if (!$statistics) { $statistics = self::create(); $statistics->link_id = $link_id; $statistics->subscriber_id = $subscriber_id; $statistics->newsletter_id = $newsletter_id; $statistics->queue_id = $queue_id; $statistics->count = 1; } else { $statistics->count++; } return $statistics->save(); } static function getAllForSubscriber(Subscriber $subscriber) { return static::tableAlias('clicks') ->select('clicks.id', 'id') ->select('newsletter_rendered_subject') ->select('clicks.created_at', 'created_at') ->select('url') ->join( SendingQueue::$_table, array('clicks.queue_id', '=', 'queue.id'), 'queue' ) ->join( NewsletterLink::$_table, array('clicks.link_id', '=', 'link.id'), 'link' ) ->where('clicks.subscriber_id', $subscriber->id()) ->orderByAsc('url'); } static function findLatestPerNewsletterBySubscriber(Subscriber $subscriber, DateTimeInterface $before, $since_days_ago) { // subquery to find latest click IDs for each newsletter $table = self::$_table; $latest_click_ids_per_newsletter_query = " SELECT ( SELECT id FROM $table WHERE newsletter_id = c.newsletter_id ORDER BY updated_at DESC LIMIT 1 ) FROM $table c WHERE c.subscriber_id = :subscriber_id AND c.updated_at < :before AND c.updated_at > DATE_SUB(NOW(), INTERVAL :since_days_ago DAY) GROUP BY c.newsletter_id "; return static::tableAlias('clicks') ->whereRaw("clicks.id IN ($latest_click_ids_per_newsletter_query)", [ 'subscriber_id' => $subscriber->id, 'before' => $before->format('Y-m-d H:i:s'), 'since_days_ago' => $since_days_ago, ]) ->findMany(); } }