laravel 經常使用命令

Artisan 經常使用命令javascript

 

//在版本5.1.11新添加,見http://laravel-china.org/docs/5.1/5.1/authorization#creating-policies
php artisan make:policy PostPolicy
//針對命令顯示幫助信息
php artisan --help OR -h
//抑制輸出信息
php artisan --quiet OR -q
//打印 Laravel 的版本信息
php artisan --version OR -v
//不詢問在任何交互性的問題
php artisan --on-interaction OR -n 
//強制輸出 ANSI 格式
php artisan --ansi
//禁止輸出 ANSI 格式
php artisan --no-ansi
//顯示當前命令行運行的環境
php artisan --env 
//-v|vv|vvv經過添加 V 的個數來控制命令行輸出內容的詳盡狀況:1個表明正常輸出,2個表明輸出更多消息,3個表明調試
php artisan --verbose
//移除編譯優化過的文件(storage/frameworks/compiled.php)
php artisan clear-compiled
//顯示當前框架運行的環境
php artisan env
//顯示某個命令的幫助信息
php artisan help
//顯示全部可用的命令
php artisan list
//進入應用交互模式
php artisan tinker
//進入維護模式
php artisan down
//退出維護模式
php artisan up
//優化框架性能
// --force  強制編譯已寫入文件
(storage、frameworks、compiled.php)
//--psr 不對 Composer 的 dump-autoload 進行優化
php artisan optimize [--force][--psr]
//啓動內置服務器
php artisan serve
//更改默認端口
php artisan server --port 8080
//使其在本地服務器外也可正常工做
php artisan server --host 0.0.0.0
//更改命名空間
php artisan app:name namespace
//清除過時的密碼重置令牌
php artisan auth:clear-resets
//清空應用緩存
php artisan cache:cache
//建立緩存數據庫表
php artisan cache:table
//合併全部的配置信息爲一個,提升加載速度
php artisan config:cache
//移除配置緩存文件
php artisan config:clear
//程序內部調用Artisan命令
$exitCode = Artisan::call('config:cache');
//運行全部的 seed 假數據生成類
//--class  能夠指定運行的類,默認是:"DatabaseSeeder"
//--database 能夠指定數據庫
//--force  當處於生產環境時強制執行操做
php artisan db:seed[--class[="..."]] [--database[="..."]] [--force]
//基於註冊的信息,生成遺漏的 events 和 handlers
php artisan event:generate
//生成新的處理類
//--command  須要處理器處理的命令類名字
php artisan handler:command [--command="..."] name
// 建立一個新的時間處理類
//--event 須要處理器處理的事件類名字
//--queued 須要處理器使用隊列處理的事件類名字
php artisan handler:event [--event="..."] [--queued] name
//生成應用的 key(會覆蓋)
php artisan key:generate
// 在默認狀況下, 這將建立未加入隊列的自處理命令
 // 經過 --handler 標識來生成一個處理器, 用 --queued 來使其入隊列.
php artisan make:command [--handler] [--queued] name
// 建立一個新的 Artisan 命令
 //  --command     命令被調用的名稱。 (默認爲: "command:name")
php artisan make:console [--command[="..."]] name
// 建立一個新的資源控制器
 // --plain      生成一個空白的控制器類
php artisan make:controller [--plain] name
php artisan make:controller App\\Admin\\Http\\Controllers\\DashboardController
// 建立一個新的事件類
php artisan make:event name
// 建立一個新的中間件類
php artisan make:middleware name
// 建立一個新的遷移文件
 // --create     將被建立的數據表.
 // --table      將被遷移的數據表.
php artisan make:migration [--create[="..."]] [--table[="..."]] name
// 建立一個新的 Eloquent 模型類
php artisan make:model name
// 建立一個新的服務提供者類
php artisan make:provider name
// 建立一個新的表單請求類
php artisan make:request name
// 數據庫遷移
 // --database   指定數據庫鏈接(下同)
 // --force      當處於生產環境時強制執行,不詢問(下同)
 // --path       指定單獨遷移文件地址
 // --pretend    把將要運行的 SQL 語句打印出來(下同)
 // --seed       Seed 任務是否須要被從新運行(下同)
php artisan migrate [--database[="..."]] [--force] [--path[="..."]] [--pretend] [--seed]
// 建立遷移數據庫表
php artisan migrate:install [--database[="..."]]
// 重置並從新運行全部的 migrations
 // --seeder     指定主 Seeder 的類名
php artisan migrate:refresh [--database[="..."]] [--force] [--seed] [--seeder[="..."]]
// 回滾全部的數據庫遷移
php artisan migrate:reset [--database[="..."]] [--force] [--pretend]
// 回滾最最近一次運行的遷移任務
php artisan migrate:rollback [--database[="..."]] [--force] [--pretend]
// migrations 數據庫表信息
php artisan migrate:status
// 爲隊列數據庫表建立一個新的遷移
php artisan queue:table
// 監聽指定的隊列
 // --queue      被監聽的隊列
 // --delay      給執行失敗的任務設置延時時間 (默認爲零: 0)
 // --memory     內存限制大小,單位爲 MB (默認爲: 128)
 // --timeout    指定任務運行超時秒數 (默認爲: 60)
 // --sleep      等待檢查隊列任務的秒數 (默認爲: 3)
 // --tries      任務記錄失敗重試次數 (默認爲: 0)
php artisan queue:listen [--queue[="..."]] [--delay[="..."]] [--memory[="..."]] [--timeout[="..."]] [--sleep[="..."]] [--tries[="..."]] [connection]
// 查看全部執行失敗的隊列任務
php artisan queue:failed
// 爲執行失敗的數據表任務建立一個遷移
php artisan queue:failed-table
// 清除全部執行失敗的隊列任務
php artisan queue:flush
// 刪除一個執行失敗的隊列任務
php artisan queue:forget
// 在當前的隊列任務執行完畢後, 重啓隊列的守護進程
php artisan queue:restart
// 對指定 id 的執行失敗的隊列任務進行重試(id: 失敗隊列任務的 ID)
php artisan queue:retry id
// 指定訂閱 Iron.io 隊列的連接
 // queue: Iron.io 的隊列名稱.
 // url: 將被訂閱的 URL.
 // --type       指定隊列的推送類型.
php artisan queue:subscribe [--type[="..."]] queue url
// 處理下一個隊列任務
 // --queue      被監聽的隊列
 // --daemon     在後臺模式運行
 // --delay      給執行失敗的任務設置延時時間 (默認爲零: 0)
 // --force      強制在「維護模式下」運行
 // --memory     內存限制大小,單位爲 MB (默認爲: 128)
 // --sleep      當沒有任務處於有效狀態時, 設置其進入休眠的秒數 (默認爲: 3)
 // --tries      任務記錄失敗重試次數 (默認爲: 0)
php artisan queue:work [--queue[="..."]] [--daemon] [--delay[="..."]] [--force] [--memory[="..."]] [--sleep[="..."]] [--tries[="..."]] [connection]

// 生成路由緩存文件來提高路由效率
php artisan route:cache
// 移除路由緩存文件
php artisan route:clear
// 顯示已註冊過的路由
php artisan route:list

// 運行計劃命令
php artisan schedule:run

// 爲 session 數據表生成遷移文件
php artisan session:table

// 從 vendor 的擴展包中發佈任何可發佈的資源
 // --force        重寫全部已存在的文件
 // --provider     指定你想要發佈資源文件的服務提供者
 // --tag          指定你想要發佈標記資源.
php artisan vendor:publish [--force] [--provider[="..."]] [--tag[="..."]]
php artisan tail [--path[="..."]] [--lines[="..."]] [connection]

Composer 命令php

composer create-project laravel/laravel folder_name
composer install
composer update
composer dump-autoload [--optimize]
composer self-update
composer require [options] [--] [vendor/packages]...

DB類的基礎使用html

DB::connection('connection_name');
// 運行數據庫查詢語句
$results = DB::select('select * from users where id = ?', [1]);
$results = DB::select('select * from users where id = :id', ['id' => 1]);
// 運行普通語句
DB::statement('drop table users');
// 監聽查詢事件
DB::listen(function($sql, $bindings, $time){ code_here; });
// 數據庫事務處理
DB::transaction(function()
{
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
});
DB::beginTransaction();
DB::rollBack();
DB::commit();
              
查詢語句構造器 
// 取得數據表的全部行
DB::table('name')->get();
// 取數據表的部分數據
DB::table('users')->chunk(100, function($users)
{
  foreach ($users as $user)
  {
      
//
 }
});
// 取回數據表的第一條數據
$user = DB::table('users')->where('name', 'John')->first();
DB::table('name')->first();
// 從單行中取出單列數據
$name = DB::table('users')->where('name', 'John')->pluck('name');
DB::table('name')->pluck('column');
// 取多行數據的「列數據」數組
$roles = DB::table('roles')->lists('title');
$roles = DB::table('roles')->lists('title', 'name');
// 指定一個選擇字句
$users = DB::table('users')->select('name', 'email')->get();
$users = DB::table('users')->distinct()->get();
$users = DB::table('users')->select('name as user_name')->get();
// 添加一個選擇字句到一個已存在的查詢語句中
$query = DB::table('users')->select('name');
$users = $query->addSelect('age')->get();
// 使用 Where 運算符
$users = DB::table('users')->where('votes', '>', 100)->get();
$users = DB::table('users')
              ->where('votes', '>', 100)
              ->orWhere('name', 'John')
              ->get();
$users = DB::table('users')
      ->whereBetween('votes', [1, 100])->get();
$users = DB::table('users')
      ->whereNotBetween('votes', [1, 100])->get();
$users = DB::table('users')
      ->whereIn('id', [1, 2, 3])->get();
$users = DB::table('users')
      ->whereNotIn('id', [1, 2, 3])->get();
$users = DB::table('users')
      ->whereNull('updated_at')->get();
DB::table('name')->whereNotNull('column')->get();
// 動態的 Where 字句
$admin = DB::table('users')->whereId(1)->first();
$john = DB::table('users')
      ->whereIdAndEmail(2, 'john@doe.com')
      ->first();
$jane = DB::table('users')
      ->whereNameOrAge('Jane', 22)
      ->first();
// Order By, Group By, 和 Having
$users = DB::table('users')
      ->orderBy('name', 'desc')
      ->groupBy('count')
      ->having('count', '>', 100)
      ->get();
DB::table('name')->orderBy('column')->get();
DB::table('name')->orderBy('column','desc')->get();
DB::table('name')->having('count', '>', 100)->get();
// 偏移 & 限制
$users = DB::table('users')->skip(10)->take(5)->get();
          
Joins 
// 基本的 Join 聲明語句
DB::table('users')
    ->join('contacts', 'users.id', '=', 'contacts.user_id')
    ->join('orders', 'users.id', '=', 'orders.user_id')
    ->select('users.id', 'contacts.phone', 'orders.price')
    ->get();
// Left Join 聲明語句
DB::table('users')
->leftJoin('posts', 'users.id', '=', 'posts.user_id')
->get();
// select * from users where name = 'John' or (votes > 100 and title <> 'Admin')
DB::table('users')
    ->where('name', '=', 'John')
    ->orWhere(function($query)
    {
        $query->where('votes', '>', 100)
              ->where('title', '<>', 'Admin');
    })
    ->get();
          
聚合 
$users = DB::table('users')->count();
$price = DB::table('orders')->max('price');
$price = DB::table('orders')->min('price');
$price = DB::table('orders')->avg('price');
$total = DB::table('users')->sum('votes');
          
原始表達句
$users = DB::table('users')
                   ->select(DB::raw('count(*) as user_count, status'))
                   ->where('status', '<>', 1)
                   ->groupBy('status')
                   ->get();
// 返回行
DB::select('select * from users where id = ?', array('value'));
DB::insert('insert into foo set bar=2');
DB::update('update foo set bar=2');
DB::delete('delete from bar');
// 返回 void
DB::statement('update foo set bar=2');
// 在聲明語句中加入原始的表達式
DB::table('name')->select(DB::raw('count(*) as count, column2'))->get();
          
Inserts / Updates / Deletes / Unions / Pessimistic Locking
// 插入
DB::table('users')->insert(
  ['email' => 'john@example.com', 'votes' => 0]
);
$id = DB::table('users')->insertGetId(
  ['email' => 'john@example.com', 'votes' => 0]
);
DB::table('users')->insert([
  ['email' => 'taylor@example.com', 'votes' => 0],
  ['email' => 'dayle@example.com', 'votes' => 0]
]);
// 更新
DB::table('users')
          ->where('id', 1)
          ->update(['votes' => 1]);
DB::table('users')->increment('votes');
DB::table('users')->increment('votes', 5);
DB::table('users')->decrement('votes');
DB::table('users')->decrement('votes', 5);
DB::table('users')->increment('votes', 1, ['name' => 'John']);
// 刪除
DB::table('users')->where('votes', '<', 100)->delete();
DB::table('users')->delete();
DB::table('users')->truncate();
// 集合
 // unionAll() 方法也是可供使用的,調用方式與 union 類似
$first = DB::table('users')->whereNull('first_name');
$users = DB::table('users')->whereNull('last_name')->union($first)->get();
// 消極鎖
DB::table('users')->where('votes', '>', 100)->sharedLock()->get();
DB::table('users')->where('votes', '>', 100)->lockForUpdate()->get();

Routejava

路由的基礎用法laravel

Route::get('foo', function(){});
Route::get('foo', 'ControllerName@function');
Route::controller('foo', 'FooController');
              
資源路由 
Route::resource('posts','PostsController');
// 資源路由器只容許指定動做經過
 Route::resource('photo', 'PhotoController',['only' => ['index', 'show']]);
Route::resource('photo', 'PhotoController',['except' => ['update', 'destroy']]);
              
觸發錯誤 
App::abort(404);
$handler->missing(...) in ErrorServiceProvider::boot();
throw new NotFoundHttpException;
              
路由參數 
Route::get('foo/{bar}', function($bar){});
Route::get('foo/{bar?}', function($bar = 'bar'){});
              
HTTP 請求方式
Route::any('foo', function(){});
Route::post('foo', function(){});
Route::put('foo', function(){});
Route::patch('foo', function(){});
Route::delete('foo', function(){});
// RESTful 資源控制器
 Route::resource('foo', 'FooController');
// 爲一個路由註冊多種請求方式
 Route::match(['get', 'post'], '/', function(){});
              
安全路由 (TBD)
Route::get('foo', array('https', function(){}));
              
路由約束
Route::get('foo/{bar}', function($bar){})
->where('bar', '[0-9]+');
Route::get('foo/{bar}/{baz}', function($bar, $baz){})
->where(array('bar' => '[0-9]+', 'baz' => '[A-Za-z]'))
              
// 設置一個可跨路由使用的模式
 Route::pattern('bar', '[0-9]+')
              
HTTP 中間件 
// 爲路由指定 Middleware
 Route::get('admin/profile', ['middleware' => 'auth', function(){}]);
Route::get('admin/profile', function(){})->middleware('auth');
              
命名路由
Route::currentRouteName();
Route::get('foo/bar', array('as' => 'foobar', function(){}));
Route::get('user/profile', [
'as' => 'profile', 'uses' => 'UserController@showProfile'
]);
Route::get('user/profile', 'UserController@showProfile')->name('profile');
$url = route('profile');
$redirect = redirect()->route('profile');
              
路由前綴
Route::group(['prefix' => 'admin'], function()
{
Route::get('users', function(){
return 'Matches The "/admin/users" URL';
});
});
              
路由命名空間
// 此路由組將會傳送 'Foo\Bar' 命名空間
 Route::group(array('namespace' => 'Foo\Bar'), function(){})
              
子域名路由
// {sub} 將在閉包中被忽略
 Route::group(array('domain' => '{sub}.example.com'), function(){});

Model基礎使用sql

// 定義一個 Eloquent 模型
 class User extends Model {}
// 生成一個 Eloquent 模型
php artisan make:model User
// 指定一個自定義的數據表名稱
 class User extends Model {
  protected $table = 'my_users';
}
          
More
Model::create(array('key' => 'value'));
// 經過屬性找到第一條相匹配的數據或創造一條新數據
 Model::firstOrCreate(array('key' => 'value'));
// 經過屬性找到第一條相匹配的數據或實例化一條新數據
 Model::firstOrNew(array('key' => 'value'));
// 經過屬性找到相匹配的數據並更新,若是不存在即建立
 Model::updateOrCreate(array('search_key' => 'search_value'), array('key' => 'value'));
// 使用屬性的數組來填充一個模型, 用的時候要當心「Mass Assignment」安全問題 !
 Model::fill($attributes);
Model::destroy(1);
Model::all();
Model::find(1);
// 使用雙主鍵進行查找
 Model::find(array('first', 'last'));
// 查找失敗時拋出異常
 Model::findOrFail(1);
// 使用雙主鍵進行查找, 失敗時拋出異常
 Model::findOrFail(array('first', 'last'));
Model::where('foo', '=', 'bar')->get();
Model::where('foo', '=', 'bar')->first();
Model::where('foo', '=', 'bar')->exists();
// 動態屬性查找
 Model::whereFoo('bar')->first();
// 查找失敗時拋出異常
 Model::where('foo', '=', 'bar')->firstOrFail();
Model::where('foo', '=', 'bar')->count();
Model::where('foo', '=', 'bar')->delete();
// 輸出原始的查詢語句
 Model::where('foo', '=', 'bar')->toSql();
Model::whereRaw('foo = bar and cars = 2', array(20))->get();
Model::on('connection-name')->find(1);
Model::with('relation')->get();
Model::all()->take(10);
Model::all()->skip(10);
// 默認的 Eloquent 排序是上升排序
 Model::all()->orderBy('column');
Model::all()->orderBy('column','desc');
              
軟刪除 
Model::withTrashed()->where('cars', 2)->get();
// 在查詢結果中包括帶被軟刪除的模型
 Model::withTrashed()->where('cars', 2)->restore();
Model::where('cars', 2)->forceDelete();
// 查找只帶有軟刪除的模型
 Model::onlyTrashed()->where('cars', 2)->get();
              
模型關聯
// 一對一 - User::phone()
 return $this->hasOne('App\Phone', 'foreign_key', 'local_key');
// 一對一 - Phone::user(), 定義相對的關聯
 return $this->belongsTo('App\User', 'foreign_key', 'other_key');

// 一對多 - Post::comments()
 return $this->hasMany('App\Comment', 'foreign_key', 'local_key');
//  一對多 - Comment::post()
 return $this->belongsTo('App\Post', 'foreign_key', 'other_key');

// 多對多 - User::roles();
 return $this->belongsToMany('App\Role', 'user_roles', 'user_id', 'role_id');
// 多對多 - Role::users();
 return $this->belongsToMany('App\User');
// 多對多 - Retrieving Intermediate Table Columns
$role->pivot->created_at;
// 多對多 - 中介表字段
 return $this->belongsToMany('App\Role')->withPivot('column1', 'column2');
// 多對多 - 自動維護 created_at 和 updated_at 時間戳
 return $this->belongsToMany('App\Role')->withTimestamps();

// 遠層一對多 - Country::posts(), 一個 Country 模型可能經過中介的 Users
 // 模型關聯到多個 Posts 模型(User::country_id)
 return $this->hasManyThrough('App\Post', 'App\User', 'country_id', 'user_id');

// 多態關聯 - Photo::imageable()
 return $this->morphTo();
// 多態關聯 - Staff::photos()
 return $this->morphMany('App\Photo', 'imageable');
// 多態關聯 - Product::photos()
 return $this->morphMany('App\Photo', 'imageable');
// 多態關聯 - 在 AppServiceProvider 中註冊你的「多態對照表」
 Relation::morphMap([
    'Post' => App\Post::class,
    'Comment' => App\Comment::class,
]);

// 多態多對多關聯 - 涉及數據庫表: posts,videos,tags,taggables
 // Post::tags()
 return $this->morphToMany('App\Tag', 'taggable');
// Video::tags()
 return $this->morphToMany('App\Tag', 'taggable');
// Tag::posts()
 return $this->morphedByMany('App\Post', 'taggable');
// Tag::videos()
 return $this->morphedByMany('App\Video', 'taggable');

// 查找關聯
$user->posts()->where('active', 1)->get();
// 獲取全部至少有一篇評論的文章...
$posts = App\Post::has('comments')->get();
// 獲取全部至少有三篇評論的文章...
$posts = Post::has('comments', '>=', 3)->get();
// 獲取全部至少有一篇評論被評分的文章...
$posts = Post::has('comments.votes')->get();
// 獲取全部至少有一篇評論類似於 foo% 的文章
$posts = Post::whereHas('comments', function ($query) {
    $query->where('content', 'like', 'foo%');
})->get();

// 預加載
$books = App\Book::with('author')->get();
$books = App\Book::with('author', 'publisher')->get();
$books = App\Book::with('author.contacts')->get();

// 延遲預加載
$books->load('author', 'publisher');

// 寫入關聯模型
$comment = new App\Comment(['message' => 'A new comment.']);
$post->comments()->save($comment);
// Save 與多對多關聯
$post->comments()->saveMany([
    new App\Comment(['message' => 'A new comment.']),
    new App\Comment(['message' => 'Another comment.']),
]);
$post->comments()->create(['message' => 'A new comment.']);

// 更新「從屬」關聯
$user->account()->associate($account);
$user->save();
$user->account()->dissociate();
$user->save();

// 附加多對多關係
$user->roles()->attach($roleId);
$user->roles()->attach($roleId, ['expires' => $expires]);
// 從用戶上移除單一身份...
$user->roles()->detach($roleId);
// 從用戶上移除全部身份...
$user->roles()->detach();
$user->roles()->detach([1, 2, 3]);
$user->roles()->attach([1 => ['expires' => $expires], 2, 3]);

// 任何不在給定數組中的 IDs 將會從中介表中被刪除。
$user->roles()->sync([1, 2, 3]);
// 你也能夠傳遞中介表上該 IDs 額外的值:
$user->roles()->sync([1 => ['expires' => true], 2, 3]);

              
事件
              
Model::creating(function($model){});
Model::created(function($model){});
Model::updating(function($model){});
Model::updated(function($model){});
Model::saving(function($model){});
Model::saved(function($model){});
Model::deleting(function($model){});
Model::deleted(function($model){});
Model::observe(new FooObserver);
              
              
Eloquent 配置信息
              
// 關閉模型插入或更新操做引起的 「mass assignment」異常
 Eloquent::unguard();
// 從新開啓「mass assignment」異常拋出功能
 Eloquent::reguard();

Auth

用戶認證數據庫

用戶認證 
// 判斷當前用戶是否已認證(是否已登陸)
 Auth::check();
// 獲取當前的認證用戶
 Auth::user();
// 獲取當前的認證用戶的 ID(未登陸狀況下會報錯)
 Auth::id();
// 經過給定的信息來嘗試對用戶進行認證(成功後會自動啓動會話)
 Auth::attempt(['email' => $email, 'password' => $password]);
// 經過 Auth::attempt() 傳入 true 值來開啓 '記住我' 功能
 Auth::attempt($credentials, true);
// 只針對一次的請求來認證用戶
 Auth::once($credentials);
// 登陸一個指定用戶到應用上
 Auth::login(User::find(1));
// 登陸指定用戶 ID 的用戶到應用上
 Auth::loginUsingId(1);
// 使用戶退出登陸(清除會話)
 Auth::logout();
// 驗證用戶憑證
 Auth::validate($credentials);
// Attempt to authenticate using HTTP Basic Auth
 // 使用 HTTP 的基本認證方式來認證
 Auth::basic('username');
// Perform a stateless HTTP Basic login attempt
 // 執行「HTTP Basic」登陸嘗試
 Auth::onceBasic();
// 發送密碼重置提示給用戶
 Password::remind($credentials, function($message, $user){});
              
用戶受權 
// 定義權限
 Gate::define('update-post', 'Class@method');
Gate::define('update-post', function ($user, $post) {...});
// 傳遞多個參數
 Gate::define('delete-comment', function ($user, $post, $comment) {});

// 檢查權限
 Gate::denies('update-post', $post);
Gate::allows('update-post', $post);
Gate::check('update-post', $post);
// 指定用戶進行檢查
 Gate::forUser($user)->allows('update-post', $post);
// 在 User 模型下,使用 Authorizable trait
 User::find(1)->can('update-post', $post);
User::find(1)->cannot('update-post', $post);

// 攔截全部檢查
 Gate::before(function ($user, $ability) {});
Gate::after(function ($user, $ability) {});

// Blade 模板語法
 @can('update-post', $post)
@endcan
// 支持 else 表達式
 @can('update-post', $post)
@else
@endcan

// 生成一個新的策略
php artisan make:policy PostPolicy
// `policy` 幫助函數
policy($post)->update($user, $post)

// 控制器受權
$this->authorize('update', $post);
// 指定用戶 $user 受權
$this->authorizeForUser($user, 'update', $post);
相關文章
相關標籤/搜索