条件组合查询
<p>> v3.0.3 新增</p>
<h1>条件组合查询</h1>
<p>在 <code>OwlAdmin</code> 中,可以使用 <code>ConditionBuilder</code> 组件来灵活的构建条件组合查询。</p>
<h2><strong>使用</strong></h2>
<h3>1. 在 <code>Model</code> 中引入 <code>ConditionBuilderScopeTrait</code></h3>
<pre><code class="language-php">
use Slowlyo\OwlAdmin\Traits\ConditionBuilderScopeTrait;
class User extends Model
{
use ConditionBuilderScopeTrait;
}</code></pre>
<p><br></p>
<h3>2. 在需要使用条件组合查询的语句中,添加 <code>withConditionBuilder()</code> 方法`</h3>
<p><code>withConditionBuilder()</code> 是在 <code>ConditionBuilderScopeTrait</code> 中实现的 <a href="https://learnku.com/docs/laravel/9.x/eloquent/12251#f97e0f">局部查询作用域</a></p>
<pre><code class="language-php">User::query()-&gt;withConditionBuilder()-&gt;get();
// 可以传入 true , 使构建的查询字段不拼接表名
User::query()-&gt;withConditionBuilder(true)-&gt;get();</code></pre>
<p><br></p>
<h3>3. 添加 <code>ConditionBuilder</code> 组件</h3>
<p>以基础的 <code>CRUD</code> 页面为例:</p>
<p><code>ConditionBuilder</code> 组件的使用,请参考 <a href="https://aisuda.bce.baidu.com/amis/zh-CN/components/form/condition-builder">官方文档</a></p>
<pre><code class="language-php">public function list(): Page
{
$crud = $this-&gt;baseCRUD()
-&gt;filter(
$this-&gt;baseFilter()-&gt;body([
// baseFilterConditionBuilder 方法已在基类中实现
$this-&gt;baseFilterConditionBuilder()-&gt;fields([
// text 类型
[
'name' =&gt; 'title',
'label' =&gt; '名称',
'type' =&gt; 'text',
],
// 自定义类型
[
'type' =&gt; 'custom', // 设置类型为 自定义
'name' =&gt; 'custom', // 字段名
'label' =&gt; '自定义', // 字段标题
'operators' =&gt; [ // 设置操作符
[
'label' =&gt; '自定义', // 操作符标题
'value' =&gt; 'custom-op', // 操作符值
],
],
'value' =&gt; amis()-&gt;TextControl(), // right 需要渲染的组件
],
]),
])
)
-&gt;columns([
// ...
]);
return $this-&gt;baseList($crud);
}</code></pre>
<p><br></p>
<h2><strong>扩展</strong></h2>
<p>在准备扩展前,请先确保读懂了 <code>ConditionBuilderScopeTrait</code> 的实现,以及 <code>ConditionBuilder</code> 组件的使用</p>
<h3>1. 参考上述示例,添加自定义类型</h3>
<p><br></p>
<h3>2. 在对应的 <code>Model</code> 中,添加 <code>extraConditionBuilderQuery</code> 方法</h3>
<pre><code class="language-php">class User Extends Model
{
use ConditionBuilderScopeTrait;
/**
* @param \Illuminate\Database\Query\Builder|self $query query实例
* @param array $filter 筛选项
* @param string $or 组合方式 and / or
*
* @return void
*/
public function extraConditionBuilderQuery($query, $filter, $or)
{
$field = data_get($filter, 'left.field'); // 获取到要查询的字段
$op = data_get($filter, 'op'); // 操作符, 对应到自定义类型中的 operators 下的某一项的 value
$value = data_get($filter, 'right'); // 用户输入的值
// 根据操作符,进行自定义查询
if ($op === 'custom-op') {
$query-&gt;where($field, '=', $value, $or);
}
}
}</code></pre>
<p><br></p>
<p>注意:</p>
<ul>
<li>在构建查询时,涉及循环&递归,请不要在 <code>extraConditionBuilderQuery</code> 方法中进行任何io操作~</li>
<li>ConditionBuilder 组件产生的数据较大,建议使用 post 请求~</li>
</ul>