catchAdmin/extend/catcher/CatchQuery.php

214 lines
5.5 KiB
PHP
Raw Normal View History

2020-01-13 16:22:16 +08:00
<?php
namespace catcher;
2020-01-21 17:56:28 +08:00
use catcher\base\CatchModel;
2020-01-13 16:22:16 +08:00
use think\db\Query;
2020-01-21 17:56:28 +08:00
use think\Paginator;
2020-01-13 16:22:16 +08:00
class CatchQuery extends Query
{
/**
*
* @time 2020年01月13日
* @param string $model
* @param string $joinField
* @param string $currentJoinField
2020-01-13 21:24:27 +08:00
* @param array $field
2020-01-13 16:22:16 +08:00
* @param string $type
* @param array $bind
* @return CatchQuery
*/
2020-01-13 21:24:27 +08:00
public function catchJoin(string $model, string $joinField, string $currentJoinField, array $field = [], string $type = 'INNER', array $bind = []): CatchQuery
2020-01-13 16:22:16 +08:00
{
2020-01-13 21:24:27 +08:00
$table = app($model)->getTable();
2020-01-13 16:22:16 +08:00
2020-01-13 21:24:27 +08:00
// 合并字段
$this->options['field'] = array_merge($this->options['field'], array_map(function ($value) use ($table) {
return $table . '.' . $value;
}, $field));
return $this->join($table, sprintf('%s.%s=%s.%s', $table, $joinField, $this->getAlias(), $currentJoinField), $type, $bind);
2020-01-13 16:22:16 +08:00
}
/**
*
* @time 2020年01月13日
* @param string $model
* @param string $joinField
* @param string $currentJoinField
2020-01-13 21:24:27 +08:00
* @param array $field
2020-01-13 16:22:16 +08:00
* @param array $bind
* @return CatchQuery
*/
2020-01-13 21:24:27 +08:00
public function catchLeftJoin(string $model, string $joinField, string $currentJoinField, array $field = [], array $bind = []): CatchQuery
2020-01-13 16:22:16 +08:00
{
2020-01-13 21:24:27 +08:00
return $this->catchJoin($model, $joinField, $currentJoinField, $field,'LEFT', $bind);
2020-01-13 16:22:16 +08:00
}
/**
2020-01-13 21:24:27 +08:00
*
2020-01-13 16:22:16 +08:00
* @time 2020年01月13日
* @param string $model
* @param string $joinField
* @param string $currentJoinField
2020-01-13 21:24:27 +08:00
* @param array $field
2020-01-13 16:22:16 +08:00
* @param array $bind
* @return CatchQuery
*/
2020-01-13 21:24:27 +08:00
public function catchRightJoin(string $model, string $joinField, string $currentJoinField, array $field = [], array $bind = []): CatchQuery
{
return $this->catchJoin($model, $joinField, $currentJoinField, $field,'RIGHT', $bind);
}
/**
* rewrite
*
* @time 2020年01月13日
* @param array|string $field
* @param bool $needAlias
* @return $this|Query
*/
public function withoutField($field, $needAlias = false)
{
if (empty($field)) {
2020-05-25 14:30:28 +08:00
return $this;
2020-01-13 21:24:27 +08:00
}
if (is_string($field)) {
2020-05-25 14:30:28 +08:00
$field = array_map('trim', explode(',', $field));
2020-01-13 21:24:27 +08:00
}
// 过滤软删除字段
$field[] = $this->model->getDeleteAtField();
// 字段排除
$fields = $this->getTableFields();
$field = $fields ? array_diff($fields, $field) : $field;
if (isset($this->options['field'])) {
2020-05-25 14:30:28 +08:00
$field = array_merge((array) $this->options['field'], $field);
2020-01-13 21:24:27 +08:00
}
2020-01-13 21:40:07 +08:00
$this->options['field'] = array_unique($field);
2020-01-13 21:24:27 +08:00
if ($needAlias) {
2020-05-25 14:30:28 +08:00
$alias = $this->getAlias();
$this->options['field'] = array_map(function ($field) use ($alias) {
2020-01-13 21:24:27 +08:00
return $alias . '.' . $field;
2020-01-13 21:40:07 +08:00
}, $this->options['field']);
2020-01-13 21:24:27 +08:00
}
return $this;
}
2020-05-26 09:32:52 +08:00
/**
*
* @time 2020年01月13日
* @param array $params
* @return CatchQuery
*/
public function catchSearch($params = []): CatchQuery
2020-01-13 21:24:27 +08:00
{
2020-05-26 09:32:52 +08:00
$params = empty($params) ? \request()->param() : $params;
2020-01-13 21:24:27 +08:00
2020-04-24 14:31:46 +08:00
if (empty($params)) {
return $this;
}
2020-01-13 21:24:27 +08:00
return $this->withSearch(array_keys($params), Utils::filterSearchParams($params));
}
/**
*
* @time 2020年01月13日
* @return mixed
*/
public function getAlias()
{
return isset($this->options['alias']) ? $this->options['alias'][$this->getTable()] : $this->getTable();
}
/**
* rewrite
*
* @time 2020年01月13日
* @param string $field
* @param mixed $condition
* @param string $option
* @param string $logic
* @return Query
*/
2020-01-20 11:46:32 +08:00
public function whereLike(string $field, $condition, string $logic = 'AND', $option = 'both'): Query
2020-01-13 16:22:16 +08:00
{
2020-01-13 21:24:27 +08:00
switch ($option) {
case 'both':
$condition = '%' . $condition . '%';
break;
case 'left':
$condition = '%' . $condition;
break;
default:
$condition .= '%';
}
return parent::whereLike($this->getAlias() . '.' . $field, $condition, $logic);
2020-01-13 16:22:16 +08:00
}
2020-01-13 21:40:07 +08:00
/**
* 额外的字段
*
* @time 2020年01月13日
* @param array $fields
* @return CatchQuery
*/
public function addFields(array $fields): CatchQuery
{
$this->options['field'] = array_merge($this->options['field'], $fields);
return $this;
}
2020-01-21 17:56:28 +08:00
public function paginate($listRows = null, $simple = false): Paginator
{
if (!$listRows) {
$limit = \request()->param('limit');
$listRows = $limit ? : CatchModel::LIMIT;
}
return parent::paginate($listRows, $simple); // TODO: Change the autogenerated stub
}
2020-04-30 17:58:36 +08:00
/**
* order 排序
*
* @time 2020年04月30日
* @param string $field
* @param string $order
* @param string $position
* @return $this|CatchQuery
*/
public function order($field = '', string $order = 'desc', $position = 'backend')
{
2020-05-25 14:30:28 +08:00
// 排序在前
2020-04-30 17:58:36 +08:00
if ($position = 'front') {
parent::order($field, $order);
}
2020-05-25 14:30:28 +08:00
if (in_array('sort', array_keys($this->getFields()))) {
parent::order('sort', $order);
}
// 紧跟权重的排序
2020-04-30 17:58:36 +08:00
if ($position == 'middle') {
parent::order($field, $order);
}
2020-05-25 14:30:28 +08:00
parent::order($this->getPk(), $order);
// 最后插入排序
2020-04-30 17:58:36 +08:00
if ($position == 'backend') {
parent::order($field, $order);
}
return $this;
}
2020-01-13 16:22:16 +08:00
}