如何在 Laravel 中获取非主键列字段的唯一值?
以下是一些在 Laravel 中获取非主键列字段唯一值的不同方法。假设我们已经使用以下查询创建了一个名为 students 的表:
CREATE TABLE students( id INTEGER NOT NULL PRIMARY KEY, name VARCHAR(15) NOT NULL, mail VARCHAR(20) NOT NULL, created_at VARCHAR(27), updated_at VARCHAR(27), address VARCHAR(30) NOT NULL );
并按如下所示填充它:
+----+---------------+------------------+-----------------------------+-----------------------------+---------+ | id | name | email | created_at | updated_at | address | | 1 | Siya Khan | [email protected] | 2022-05-01T13:45:55.000000Z | 2022-05-01T13:45:55.000000Z | Xyz | | 2 | Rehan Khan | [email protected] | 2022-05-01T13:49:50.000000Z | 2022-05-01T13:49:50.000000Z | Xyz | | 3 | Rehan Khan | [email protected] | NULL | NULL | testing | | 4 | Rehan | [email protected] | NULL | NULL | abcd | +----+---------------+------------------+-----------------------------+-----------------------------+---------+
使用模型 Eloquent
Eloquent 是一个新的对象关系映射器 (ORM),它有助于与数据库交互。使用 Eloquent,每个表都具有一个映射模型,负责该表上的所有操作。
在 Laravel 中,模型代表数据库中的表。例如,如果您有表 customers,模型名称将为 customer;对于 users,将为 user;对于 employees,将为 employee。表名必须是复数,模型名必须是单数。这是一个遵循的模式,但这并不会阻止您使用您选择的表名和模型名的命名约定。
示例
在您的控制器中使用 student 模型,如下例所示:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Student; class StudentController extends Controller { public function index() { $student = Student::select('name')->distinct()->get()->toArray(); print_r($student); } }
在上面的示例中,distinct() 方法用于从“students”表中获取唯一值。
输出
上述查询的输出如下所示:
Array( [0] => Array( [name] => Siya Khan ) [1] => Array( [name] => Rehan Khan ) [2] => Array( [name] => Rehan ) )
使用 distinct() 函数
distinct() 方法将返回表中的唯一值。其 SQL 查询如下:
SELECT distinct name from students;
您也可以在模型 Eloquent 上使用 distinct() 方法,如下所示:
示例
namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Student; class StudentController extends Controller { public function index() { $student = Student::distinct()->get(['name'])->toArray(); print_r($student); } }
输出
以上代码的输出为:
Array( [0] => Array( [name] => Rehan ) [1] => Array( [name] => Rehan Khan ) [2] => Array( [name] => Siya Khan ) )
使用 groupby() 方法
groupby() 方法有助于根据给定的字段名称对值进行分组。使用 groupby 的语法如下:
odel::select('fieldname')->groupBy('fieldname')
SQL 查询如下:
SELECT name FROM students GROUP BY name;
示例
您也可以使用 groupby() 方法,如下所示:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Student; class StudentController extends Controller { public function index() { $student = Student::select('name')->groupBy('name')->get()->toArray(); print_r($student); } }
输出
以上代码的输出为:
Array ( [0] => Array ( [name] => Rehan ) [1] => Array ( [name] => Rehan Khan ) [2] => Array ( [name] => Siya Khan )
使用 unique() 方法
unique() 方法将返回表中存在的唯一值。使用 unique() 方法的语法如下:
Model::all()->unique('fieldname')
示例
如下例所示使用 unique() 方法:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Student; class StudentController extends Controller { public function index() { $student = Student::all()->unique('name')->toArray(); print_r($student); } }
输出
以上代码的输出如下:
Array( [0] => Array( [id] => 1 [name] => Siya Khan [email] => [email protected] [created_at] => 2022-05-01T13:45:55.000000Z [updated_at] => 2022-05-01T13:45:55.000000Z [address] => Xyz ) [1] => Array( [id] => 2 [name] => Rehan Khan [email] => [email protected] [created_at] => 2022-05-01T13:49:50.000000Z [updated_at] => 2022-05-01T13:49:50.000000Z [address] => Xyz ) [3] => Array( [id] => 4 [name] => Rehan [email] => [email protected] [created_at] => [updated_at] => [address] => abcd ) )
示例
使用 DB Facade
让我们在控制器中使用 DB Facade,如下所示。我们将使用 distinct() 方法从 students 表中获取唯一名称。
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use DB; class StudentController extends Controller{ public function index() { $stdDetails = DB::table('students')->distinct()->get(['name'])->toArray(); print_r($stdDetails); } }
输出
以上代码的输出为:
Array ( [0] => stdClass Object ( [name] => Siya Khan ) [1] => stdClass Object( [name] => Rehan Khan ) [2] => stdClass Object ( [name] => Rehan ) )
示例
在 students 表上使用 groupBy() 方法。示例如下:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use DB; class StudentController extends Controller{ public function index() { $stdDetails = DB::table('students')->select('name')->groupBy('name')->get()->pluck('name')->all(); print_r($stdDetails); } }
输出
以上代码的输出如下
Array( [0] => Rehan [1] => Rehan Khan [2] => Siya Khan )