Erweiterte Abfragen (Query Builder 9)


Schnellabfrage

Die Shortcut-Abfragemethode ist eine vereinfachte Methode zum Schreiben derselben Abfragebedingungen in mehreren Feldern. Sie kann das Schreiben von Abfragebedingungen weiter vereinfachen in mehreren Feldern. Verwenden Sie |, um O zu trennen R-Abfrage, getrennt durch & zur Darstellung einer UND-Abfrage, kann beispielsweise die folgende Abfrage implementieren:

Db::table('think_user')
    ->where('name|title','like','thinkphp%')
    ->where('create_time&update_time','>',0)
    ->find();

Die generierte Abfrage-SQL lautet:

SELECT * FROM `think_user` WHERE ( `name` LIKE 'thinkphp%' OR `title` LIKE 'thinkphp%' ) AND ( `create_time` > 0 AND `update_time` > 0 ) LIMIT 1

Schnellabfrage unterstützt alle Abfrageausdrücke.

Batch-(Feld-)Abfrage

kann Batch-bedingte Abfragen mit mehreren Bedingungen definieren, zum Beispiel:

Db::table('think_user')
    ->where([
        ['name', 'like', 'thinkphp%'],
        ['title', 'like', '%thinkphp'],
        ['id', '>', 0],
        ['status', '=', 1],
    ])
    ->select();

Die generierte SQL-Anweisung lautet:

SELECT * FROM `think_user` WHERE `name` LIKE 'thinkphp%' AND `title` LIKE '%thinkphp' AND `id` > 0 AND `status` = '1'

Wenn Sie die Exp-Abfrage im Array-Modus verwenden, müssen Sie die Raw-Methode verwenden.

Db::table('think_user')
    ->where([
        ['name', 'like', 'thinkphp%'],
        ['title', 'like', '%thinkphp'],
        ['id', 'exp', Db::raw('>score')],
        ['status', '=', 1],
    ])
    ->select();

Array-Abfragemethode: Stellen Sie sicher, dass Ihr Abfragearray nicht durch vom Benutzer übermittelte Daten gesteuert werden kann. Die vom Benutzer übermittelten Formulardaten sollten wie folgt als Element des Abfragearrays übergeben werden:

Db::table('think_user')
    ->where([
        ['name', 'like', $name . '%'],
        ['title', 'like', '%' . $title],
        ['id', '>', $id],
        ['status', '=', $status],
    ])
    ->select();

Hinweis: Mehrere Abfragebedingungen für dasselbe Feld können zusammengeführt werden. Wenn Sie möchten, dass die Bedingungen in einer bestimmten where-Methode separat verarbeitet werden, können Sie die folgende Methode verwenden, um zu vermeiden, dass sie von anderen Bedingungen beeinflusst werden. Die von

$map = [
        ['name', 'like', 'thinkphp%'],
        ['title', 'like', '%thinkphp'],
        ['id', '>', 0],
    ];
Db::table('think_user')
    ->where([ $map ])
    ->where('status',1)
    ->select();

generierte SQL-Anweisung lautet:

SELECT * FROM `think_user` WHERE ( `name` LIKE 'thinkphp%' AND `title` LIKE '%thinkphp' AND `id` > 0 ) AND `status` = '1'

Mit der mehrdimensionalen Array-Abfrage können Sie problemlos verschiedene komplexe SQL-Anweisungen zusammenstellen

Wenn Sie die folgende Mehrfachbedingung verwenden Kombination

$map1 = [
        ['name', 'like', 'thinkphp%'],
        ['title', 'like', '%thinkphp'],
    ];
    
$map2 = [
        ['name', 'like', 'kancloud%'],
        ['title', 'like', '%kancloud'],
    ];    
    
Db::table('think_user')
    ->whereOr([ $map1, $map2 ])
    ->select();

Die generierte SQL-Anweisung lautet:

SELECT * FROM `think_user` WHERE ( `name` LIKE 'thinkphp%' AND `title` LIKE '%thinkphp' ) OR ( `name` LIKE 'kancloud%' AND `title` LIKE '%kancloud' )

Abschlussabfrage

$name = 'thinkphp';
$id = 10;
Db::table('think_user')->where(function ($query) use($name, $id) {
    $query->where('name', $name)
        ->whereOr('id', '>', $id);
})->select();

Die generierte SQL-Anweisung lautet:

SELECT * FROM `think_user` WHERE ( `name` = 'thinkphp' OR `id` > 10 )

Sie können sehen Alle Klammern werden außerdem automatisch auf beiden Seiten jeder Abschlussbedingung hinzugefügt.

Gemischte Abfrage

Sie können alle oben genannten Methoden kombinieren, um eine gemischte Abfrage durchzuführen, zum Beispiel:

Die von
Db::table('think_user')
    ->where('name', ['like', 'thinkphp%'], ['like', '%thinkphp'])
    ->where(function ($query) {
        $query->where('id', ['<', 10], ['>', 100], 'or');
    })
    ->select();

generierte SQL-Anweisung lautet:

SELECT * FROM `think_user` WHERE ( `name` LIKE 'thinkphp%' AND `name` LIKE '%thinkphp' ) AND ( `id` < 10 or `id` > 100 )

String-Bedingungsabfrage

Für einige wirklich komplexe Abfragen können Sie auch direkt native SQL-Anweisungen zum Abfragen verwenden, wie zum Beispiel:

Db::table('think_user')
    ->where('id > 0 AND name LIKE "thinkphp%"')
    ->select();

Aus Sicherheitsgründen können wir Parameterbindung für Zeichenfolgenabfragebedingungen verwenden, wie zum Beispiel:

Db::table('think_user')
    ->where('id > :id AND name LIKE :name ', ['id' => 0, 'name' => 'thinkphp%'])
    ->select();

Es wird empfohlen, die whereRaw-Methode zu verwenden.

Db::table('think_user')
    ->whereRaw('id > :id AND name LIKE :name ', ['id' => 0, 'name' => 'thinkphp%'])
    ->select();

Abfrage verwenden

Sie können eine Abfrage durchführen, indem Sie die Methode where einmal aufrufen und das Abfrageobjekt übergeben.

$query = new \think\db\Query;
$query->where('id','>',0)
	->where('name','like','%thinkphp');

Db::table('think_user')
    ->where($query)
    ->select();

Die Where-Methode des Abfrageobjekts kann nur einmal aufgerufen werden und kann nur in der Where-Methode aufgerufen werden. Wenn im Abfrageobjekt eine Nicht-Abfrage-Bedingungskettenmethode verwendet wird, wird dies bei der aktuellen Abfrage nicht der Fall sein übergeben werden.

$query = new \think\db\Query;
$query->where('id','>',0)
	->where('name','like','%thinkphp')
    ->order('id','desc') // 不会传入后面的查询
    ->field('name,id'); // 不会传入后面的查询

Db::table('think_user')
    ->where($query)
    ->where('title','like','thinkphp%') // 有效
    ->select();

Shortcut-Methoden

Das System kapselt eine Reihe von Shortcut-Methoden, um Abfragen zu vereinfachen, darunter:

方法作用
whereOr字段OR查询
whereXor字段XOR查询
whereNull查询字段是否为Null
whereNotNull查询字段是否不为Null
whereIn字段IN查询
whereNotIn字段NOT IN查询
whereBetween字段BETWEEN查询
whereNotBetween字段NOT BETWEEN查询
whereLike字段LIKE查询
whereNotLike字段NOT LIKE查询
whereExistsEXISTS条件查询
whereNotExistsNOT EXISTS条件查询
whereExp表达式查询
whereColumn比较两个字段

Das Folgende ist ein Beispiel für die Verwendung der whereColumn-Methode zum Vergleichen von Abfragebedingungen zwischen zwei Feldern.

Benutzerdaten abfragen, deren Aktualisierungszeit größer als die Erstellungszeit ist

Db::table('think_user')
    ->whereColumn('update_time','>','create_time')
    ->select();

Die generierte SQL-Anweisung lautet:

SELECT * FROM `think_user` WHERE ( `update_time` > `create_time` )

Abfragename und Die von den Benutzerdaten mit demselben Spitznamen

Db::table('think_user')
    ->whereColumn('name','=','nickname')
    ->select();

generierte SQL-Anweisung lautet:

SELECT * FROM `think_user` WHERE ( `name` = `nickname` )

Die gleiche Feldbedingung kann auch zu

Db::table('think_user')
    ->whereColumn('name','nickname')
    ->select();

vereinfacht werden. Unterstützt den Array-Vergleich Die von mehreren Feldern

Db::name('user')->whereColumn([
	['title', '=', 'name'],
    ['update_time', '>=', 'create_time'],
])->select();

generierte SQL-Anweisung lautet:

SELECT * FROM `think_user` WHERE ( `name` = `nickname` AND `update_time` > `create_time` )

Dynamische Abfrage

Der Abfrage-Builder bietet auch einen dynamischen Abfragemechanismus. Wird verwendet, um Abfragebedingungen zu vereinfachen , einschließlich:

动态查询描述
whereFieldName查询某个字段的值
whereOrFieldName查询某个字段的值
getByFieldName根据某个字段查询
getFieldByFieldName根据某个字段获取某个值

FieldName stellt die Kamelfalldarstellung des tatsächlichen Feldnamens der Datentabelle dar. Unter der Annahme, dass die Datentabelle user Felder für E-Mail und Spitznamen enthält, können wir eine Abfrage wie folgt durchführen.

// 根据邮箱(email)查询用户信息
$user = Db::table('user')
	->whereEmail('thinkphp@qq.com')
    ->find();

// 根据昵称(nick_name)查询用户
$email = Db::table('user')
    ->whereNickName('like', '%流年%')
    ->select();
    
// 根据邮箱查询用户信息
$user = Db::table('user')
    ->getByEmail('thinkphp@qq.com');
    
// 根据昵称(nick_name)查询用户信息
$user = Db::table('user')
    ->field('id,name,nick_name,email')
    ->getByNickName('流年');
    
// 根据邮箱查询用户的昵称
$nickname = Db::table('user')
    ->getFieldByEmail('thinkphp@qq.com', 'nick_name');
    
// 根据昵称(nick_name)查询用户邮箱
$email = Db::table('user')
    ->getFieldByNickName('流年', 'email');

Die Methoden getBy und getFieldBy fragen nur einen Datensatz ab und können in Verbindung mit anderen Kettenmethoden

Bedingungen verwendet werden Der Abfrage-Builder

unterstützt bedingte Abfragen wie:

Db::name('user')->when($condition, function ($query) {
    // 满足条件后执行
    $query->where('score', '>', 80)->limit(10);
})->select();

und unterstützt Verzweigungsabfragen, die die Bedingungen

Db::name('user')->when($condition, function ($query) {
    // 满足条件后执行
    $query->where('score', '>', 80)->limit(10);
}, function ($query) {
    // 不满足条件执行
    $query->where('score', '>', 60);
});

nicht erfüllen