這並不是什麼理論性,標準,只是自己在實踐的過程中認為其符合“資料分析-基礎維度”這一概念,姑且稱之,如有思維錯誤,請留言改正
1 什麼是基礎維度?
比如寫的這篇文章,你在上方搜尋 資料分析-基礎維度
,這篇文章會顯示出來。或者你搜尋什麼是基礎維度?
這篇文章也會顯示出來。
也可以這樣理解,有A1 A2 A3 ...An這樣n條資料,根據某一條件或者某幾個條件(條件互不影響)查詢出某一條或者某幾條結構一樣的資料,稱之為-基礎維度的資料分析
。
2 怎麼使用
從上面可以瞭解,對mysql
來說,就是一個sql的條件查詢,請注意基礎維度
關注的是一點
select * from posts where title='xxx' and content='xxxx';
你可能會問,比如說 between
xxx and
xxx 查詢,這關注的不是一個點
,而是一個線
。這裡要澄清一下,其實這裡也是關注的一個點
,這些點
,還是在同一維度
上,只不過是有多個而已。最後它們造成的結果,在這基礎維度
上是一樣的,只不過資料多了幾條者少了幾條,並沒有改變這基礎維度
。
3 Laravel 怎麼優雅的使用
這裡推薦用DB
,為什麼不用Eloquent ORM
。當然在基礎維度
上,這兩者都可以,但之後的時間維度
和空間維度
就有點捉襟見忖了。
1 在這裡定義一個基礎維度
的抽象類
<?php namespace App\Services\Search\Db\Filter;
use Illuminate\Http\Request;
use Illuminate\Database\Query\Builder;
abstract class QueryFilter
{
protected $request;
protected $builder;
public function __construct(Request $request)
{
$this->request = $request;
}
public function apply(Builder $builder)
{
$this->builder = $builder;
$this->init();
foreach ($this->filters() as $name => $value) {
if($value){
if (method_exists($this, $name)) {
call_user_func_array([$this, $name],[$value]);
}
}
}
return $this->builder;
}
protected function init()
{
//子類可以做一些初始化的查詢
}
public function filters()
{
return $this->request->all();
}
}
2 接著 PostFilter
繼承抽象類
<?php
namespace App\Services\Search\Db\Filter;
class PostFilter extends QueryFilter
{
public function title($title)
{
return $this->builder->where('title', 'like', "%{$title}%");
}
public function content($content)
{
return $this->builder->where('content','like', "%{$content}%");
}
}
3 最後去使用
use DB;
DB::table('posts')->where(function($query){
app(\App\Services\Search\Db\Filter\PostFilter::class)->apply($query);
})->get();
請求資料的時候帶著title
或者content
自動去查詢