Pertanyaan Lanjutan (Pembina Pertanyaan 9)


Pertanyaan pantas

Kaedah pertanyaan pintasan ialah cara yang dipermudahkan untuk menulis syarat pertanyaan yang sama dalam berbilang medan & untuk memisahkan mereka DAN pertanyaan boleh merealisasikan pertanyaan berikut, contohnya:

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

SQL pertanyaan yang dijana ialah:

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

Pertanyaan pantas menyokong semua ungkapan pertanyaan. Pertanyaan kelompok (medan) .

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

Kaedah pertanyaan tatasusunan memastikan tatasusunan pertanyaan anda tidak boleh dikawal oleh data yang diserahkan oleh pengguna Data borang yang diserahkan oleh pengguna harus dihantar sebagai elemen tatasusunan pertanyaan, seperti berikut:

SELECT * FROM `think_user` WHERE `name` LIKE 'thinkphp%' AND `title` LIKE '%thinkphp' AND `id` > 0 AND `status` = '1'
Perhatikan bahawa berbilang syarat pertanyaan. untuk medan yang sama Ia mungkin digabungkan Jika anda mahu keadaan dalam kaedah tertentu di mana diproses secara berasingan, anda boleh menggunakan kaedah berikut untuk mengelakkan daripada dipengaruhi oleh syarat lain. Pernyataan SQL yang dijana oleh

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

ialah:

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

Menggunakan pertanyaan tatasusunan berbilang dimensi dengan baik, anda boleh dengan mudah memasang pelbagai pernyataan SQL yang kompleks

Jika anda menggunakan gabungan berbilang syarat

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

Pernyataan SQL yang dihasilkan ialah:

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

Pertanyaan penutupan

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

Pernyataan SQL yang dihasilkan ialah:

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

Dapat dilihat bahawa kurungan akan ditambah secara automatik pada kedua-dua belah setiap keadaan penutupan.

Pertanyaan bercampur

Anda boleh menggabungkan semua kaedah yang dinyatakan sebelum ini untuk pertanyaan bercampur, contohnya:

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

Pernyataan SQL yang dijana ialah:

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

Untuk pertanyaan keadaan yang benar-benar kompleks anda juga boleh terus menggunakan pernyataan SQL asli untuk membuat pertanyaan, contohnya:

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

Atas sebab keselamatan, kami boleh menggunakan pengikatan parameter untuk syarat pertanyaan rentetan, contohnya:

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

Adalah disyorkan untuk menggunakan kaedah whereRaw.

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

Gunakan pertanyaan
Anda boleh membuat pertanyaan dengan memanggil kaedah where sekali dan menghantar objek Pertanyaan.

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

Kaedah where bagi objek Pertanyaan hanya boleh dipanggil sekali, dan hanya boleh dipanggil dalam kaedah where Jika kaedah rantaian syarat bukan pertanyaan digunakan dalam objek pertanyaan, pertanyaan semasa tidak akan dihantar.

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

Kaedah pintasan

Sistem ini merangkumi satu siri kaedah pintasan untuk memudahkan pertanyaan, termasuk:

MethodFunction
whereor 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比较两个字段

下面举例说明下两个字段比较的查询条件whereColumn方法的用法。

查询update_time大于create_time的用户数据

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

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

生成的SQL语句是:

$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();

查询name和nickname相同的用户数据

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

生成的SQL语句是:

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

相同字段条件也可以简化为

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

支持数组方式比较多个字段

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

生成的SQL语句是:

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

动态查询

查询构造器还提供了动态查询机制,用于简化查询条件,包括:

field atau query wherexor
动态查询描述
whereFieldName查询某个字段的值
whereOrFieldName查询某个字段的值
getByFieldName根据某个字段查询
getFieldByFieldName

field xor query

whereNull

Soal sama ada medan itu Null


whereNotNull

Soal sama ada medan itu bukan Null

whereIn

🎜 IN query 🎜🎜🎜🎜whereNotIn🎜🎜field NOT IN query🎜🎜🎜🎜whereBetween🎜🎜field ANTARA pertanyaan🎜🎜🎜🎜Betcode 🎜medan BUKAN ANTARA pertanyaan🎜🎜🎜🎜dimanaSuka🎜🎜medan pertanyaan SUKA🎜🎜🎜🎜dimanaTidakSuka🎜🎜medan BUKAN SUKAdi manakod SUKA🎜> kod> 🎜🎜WUJUD pertanyaan keadaan🎜🎜🎜🎜whereNotExists🎜🎜TIDAK WUJUD pertanyaan keadaan🎜🎜🎜🎜whereExp🎜🎜di mana🎜cod pertanyaan🎜🎜🎜🎜Bandingkan dua medan🎜🎜🎜🎜🎜Berikut ialah contoh cara menggunakan kaedah whereColumn untuk membandingkan keadaan pertanyaan antara dua medan. 🎜🎜🎜Pertanyaan data pengguna yang kemas kini_masanya lebih besar daripada create_time🎜
Db::name('user')->whereColumn([
	['title', '=', 'name'],
    ['update_time', '>=', 'create_time'],
])->select();
🎜Pernyataan SQL yang dijana ialah:🎜
SELECT * FROM `think_user` WHERE ( `name` = `nickname` AND `update_time` > `create_time` )
🎜Pertanyaan data pengguna dengan nama dan nama panggilan yang sama🎜rreee🎜Pernyataan SQL yang dijana ialah:🎜
// 根据邮箱(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');
🎜Keadaan medan yang sama🎜 juga dipermudahkan untuk🎜
Db::name('user')->when($condition, function ($query) {
    // 满足条件后执行
    $query->where('score', '>', 80)->limit(10);
})->select();
🎜 menyokong perbandingan tatasusunan berbilang medan🎜
Db::name('user')->when($condition, function ($query) {
    // 满足条件后执行
    $query->where('score', '>', 80)->limit(10);
}, function ($query) {
    // 不满足条件执行
    $query->where('score', '>', 60);
});
🎜Pernyataan SQL yang dihasilkan ialah:🎜rrreee🎜🎜Pertanyaan dinamik🎜🎜🎜🎜Pembina pertanyaan juga menyediakan mekanisme pertanyaan dinamik untuk memudahkan🜎: 🎜🎜 🎜dynamic query 🎜🎜description🎜🎜🎜🎜🎜🎜 wherefieldname 🎜🎜Query Nilai medan tertentu 🎜🎜🎜🎜 whereorfieldname 🎜🎜query nilai a medan tertentu🎜🎜 🎜🎜getByFieldName🎜🎜Pertanyaan berdasarkan medan tertentu🎜🎜🎜🎜getFieldByFieldName🎜🎜Dapatkan nilai tertentu berdasarkan medan tertentu🎜🎜🎜🎜🎜🎜 di mana FieldName mewakili jadual data Perwakilan kes unta bagi nama medan sebenar Dengan mengandaikan bahawa terdapat medan e-mel dan nama panggilan dalam pengguna jadual data, kita boleh bertanya seperti ini. Kaedah 🎜🎜rrreee🎜getBy dan getFieldBy hanya akan menanyakan satu rekod dan boleh digunakan bersama-sama dengan kaedah rantaian lain 🎜🎜🎜Pertanyaan bersyarat🎜🎜🎜🎜Pembina pertanyaan menyokong pertanyaan bersyarat, seperti dan🎜🎜 yang menyokong pertanyaan bersyarat: tidak memenuhi syarat Pertanyaan cawangan🎜rrreee🎜 🎜