add tags
This commit is contained in:
parent
5ff1acb093
commit
e93419eafd
10 changed files with 191 additions and 58 deletions
|
|
@ -63,59 +63,69 @@ class PostRepositoryQuery extends RepositoryQuery
|
|||
return $this;
|
||||
}
|
||||
|
||||
public function search(string $keywords)
|
||||
public function search(?string $keywords, ?string $tag)
|
||||
{
|
||||
$conn = $this->repository->getEm()->getConnection();
|
||||
if ($keywords) {
|
||||
$conn = $this->repository->getEm()->getConnection();
|
||||
|
||||
$statement = $conn->prepare(
|
||||
'SELECT
|
||||
post.id,
|
||||
post.title,
|
||||
MATCH(post.title) AGAINST(:search) AS MATCH_TITLE,
|
||||
MATCH(post.content) AGAINST(:search) AS MATCH_CONTENT
|
||||
FROM post
|
||||
WHERE
|
||||
post.status = 1 AND
|
||||
post.published_at < :date
|
||||
ORDER BY
|
||||
MATCH_TITLE DESC,
|
||||
MATCH_CONTENT DESC
|
||||
');
|
||||
$statement = $conn->prepare(
|
||||
'SELECT
|
||||
post.id,
|
||||
post.title,
|
||||
MATCH(post.title) AGAINST(:search) AS MATCH_TITLE,
|
||||
MATCH(post.content) AGAINST(:search) AS MATCH_CONTENT
|
||||
FROM post
|
||||
WHERE
|
||||
post.status = 1 AND
|
||||
post.published_at < :date
|
||||
ORDER BY
|
||||
MATCH_TITLE DESC,
|
||||
MATCH_CONTENT DESC
|
||||
');
|
||||
|
||||
$statement->execute([
|
||||
':search' => $keywords,
|
||||
':date' => (new \DateTime())->format('Y-m-d H:i:s'),
|
||||
]);
|
||||
$statement->execute([
|
||||
':search' => $keywords,
|
||||
':date' => (new \DateTime())->format('Y-m-d H:i:s'),
|
||||
]);
|
||||
|
||||
$results = $statement->fetchAll();
|
||||
$ids = [];
|
||||
$results = $statement->fetchAll();
|
||||
$ids = [];
|
||||
|
||||
foreach ($results as $k => $v) {
|
||||
$rate = ($v['MATCH_TITLE'] * 2) + $v['MATCH_CONTENT'];
|
||||
|
||||
if ($rate >= 7) {
|
||||
$ids[] = $v['id'];
|
||||
}
|
||||
}
|
||||
|
||||
if (0 == count($ids)) {
|
||||
foreach ($results as $k => $v) {
|
||||
$rate = ($v['MATCH_TITLE'] * 2) + $v['MATCH_CONTENT'];
|
||||
|
||||
if ($rate >= 6) {
|
||||
if ($rate >= 7) {
|
||||
$ids[] = $v['id'];
|
||||
}
|
||||
}
|
||||
|
||||
if (0 == count($ids)) {
|
||||
foreach ($results as $k => $v) {
|
||||
$rate = ($v['MATCH_TITLE'] * 2) + $v['MATCH_CONTENT'];
|
||||
|
||||
if ($rate >= 6) {
|
||||
$ids[] = $v['id'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$ids) {
|
||||
$ids = [-1];
|
||||
}
|
||||
|
||||
$this
|
||||
->orderBy('FIELD(p.id, :ids)')
|
||||
->andWhere('.id IN(:ids)')
|
||||
->setParameter(':ids', $ids)
|
||||
;
|
||||
}
|
||||
|
||||
if (!$ids) {
|
||||
$ids = [-1];
|
||||
if ($tag) {
|
||||
$this
|
||||
->andWhere('.tags LIKE :tag')
|
||||
->setParameter(':tag', '%'.$tag.'%');
|
||||
}
|
||||
|
||||
return $this
|
||||
->orderBy('FIELD(p.id, :ids)')
|
||||
->andWhere('.id IN(:ids)')
|
||||
->setParameter(':ids', $ids)
|
||||
;
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue