Как получить данные похожих тегов из базы данных в phalcon?

Я новичок в Phalcon. Я решил взглянуть на Phalcon php как на альтернативный фреймворк для Codeigniter. Реализую блог с тегами. где сначала я вставляю значение тегов в один столбец в db. Я следую примеру плагина тегов из: https://github.com/mfiels/tagsly/blob/master/index.html вставил несколько значений в один столбец, например "php, jquery, asp, html, css".

Теперь я просто извлекаю значение из дБ в вольт следующим образом:

[controller]

$bloger = $this->modelsManager->executeQuery("SELECT * FROM Blogs ORDER BY Blogs.datetime DESC");
$this->view->setVar('blogs', $bloger);

[volt]        

<?php 
$blogTags = array(); 
$blogTags = $bloger->tags;
$tags = explode(',',$blogTags); 
foreach($tags as $taged){ ?>
<a class="tags" href="blog/tag/<?php echo($taged); ?>">
<?php echo($taged); ?> <span>[ 0 ]</span></a>
<?php } ?>

Теперь это ссылка, например: "localhost/demo/blog/tag/php" или "localhost/demo/blog/tag/jquery". Мой вопрос: как я могу получить данные, связанные с каждым тегом, из базы данных?

Я пытаюсь сделать такой запрос:

[Контроллер]

public function tagAction($taged)
{
$tags = Blogs::findBytags($taged);
$tagData = array();
$tagData = explode(',', $tags->tags);
$similar = Blogs::find(["tags LIKE :title:","bind"=> ["title"=>'%'.$tagData.'%'],"order" => "datetime DESC limit 5"]);
$this->view->setVar('tagged', $similar);
$this->view->pick('blog/tagline');
}

[Вольт]

{% for similar in tagged %}
{{tagged.btitle}}
{% endfor %}

но его рендеринг не такой, как ожидалось. Как я могу получить совпадающие данные?


person munaz    schedule 04.04.2016    source источник
comment
выполнение $tagData = explode(',', $tags->tags); приведет к тому, что $tagData будет в формате массива. Вы не сможете выполнить like-поиск по массиву   -  person Timothy    schedule 04.04.2016
comment
Итак, как я могу так запросить, есть ли другой способ? Я имею в виду, что у каждого сообщения есть несколько тегов, таких как stackoverflow и его в одном столбце и строке, пытаясь запросить из массива в массив, и если он соответствует одному или нескольким   -  person munaz    schedule 05.04.2016


Ответы (2)


Вы можете просмотреть все текущие теги и добавить их в свой запрос один за другим. Во время цикла вы также создаете свой массив элементов привязки.

[controller] 
...
$currenttags =  explode(',', $blog->tags);

$query          = Blogs::query();
$bindParameters = [];

for($i = 0; $i < count($currenttags); $i++) {
   $query->orWhere('tags LIKE :tag' . $i . ':');
   $bindParameters['tag' . $i] = '%' . $currenttags[$i] . '%';
}

$query->bind($bindParameters);
$similar = $query->execute();

$this->view->setVar('datas', $similar); 
person Timothy    schedule 06.04.2016
comment
Сэр, я просто пробую ваш пример. Но он ничего не отображает, пустая страница, без ошибок! Я думаю, что ваш запрос работает без условия, я имею в виду мой оператор if else. в моих значениях поля тегов базы данных, таких как Social, Politics, Religion для строки 1 и для строки 2, это как Social, Religion, так как этот запрос работает? - person munaz; 09.04.2016
comment
я просто пробую var_dump ($ similar); его показывает: Примечание: неопределенное смещение: 2 дюйма ... показывает смещение 2, когда его счетчик Social, Политика и смещение 3, когда его счетчик Social, Politics, Religion и т. д. такой же, как если бы его счетчик только один тег, тогда его смещение отображалось 1 - person munaz; 09.04.2016
comment
Я не совсем понимаю ваш отзыв. Какие ошибки вы получаете? Я также вижу, что забыл добавить % к оператору Like, проверьте мой обновленный ответ - person Timothy; 09.04.2016
comment
Спасибо! Тимоти. На самом деле ты классный! Теперь он работает правильно. ошибка была "%". Спасибо снова. - person munaz; 09.04.2016

Я ожидаю, что когда пользователь посетит подробное представление сообщения, я хочу показать, что это сообщение связано / похоже на другие сообщения на этой странице. И сходство, связанное с его тегами, теперь я выясняю следующим образом:

[controller]    

public function showfullAction($id)
{
$blog = Blogs::findFirstByid($id); 
$this->view->setVar('detail', $blog);
$currenttags =  explode(',',$blog->tags);

I want to make Loop Throw....
$dataCount = count($currenttags);
$tags1 = $currenttags[0];
$tags1 = $currenttags[0];
$tags2 = $currenttags[1];
$tags3 = $currenttags[2];
$tags4 = $currenttags[3];
$tags5 = $currenttags[4];
$tags6 = $currenttags[5];
$tags7 = $currenttags[6];
$tags8 = $currenttags[7];
$tags9 = $currenttags[8];

if($dataCount == '1')
{
$similar = $this->modelsManager->executeQuery("SELECT Blogs.* FROM Blogs WHERE Blogs.tags LIKE '%$tags1%'");
}
elseif($dataCount == '2')
{
$similar = $this->modelsManager->executeQuery("SELECT Blogs.* FROM Blogs WHERE Blogs.tags LIKE '%$tags1%' or Blogs.tags LIKE '%$tags2%'");
}
elseif($dataCount == '3')
{
$similar = $this->modelsManager->executeQuery("SELECT Blogs.* FROM Blogs WHERE Blogs.tags LIKE '%$tags1%' or Blogs.tags LIKE '%$tags2%' or Blogs.tags LIKE '%$tags3%'");
}


 $this->view->setVar('datas', $similar); 

И так далее...

[View]

{% for similar in datas %}
{{link_to('blog/showfull/'~similar.id,similar.btitle,'class':'cats')}}  
{% endfor %}

Теперь он работает так, как ожидалось. Но есть ли еще один легкий, маленький простой способ сделать это? Пожалуйста! Спасибо Тимоти

person munaz    schedule 07.04.2016