如何在 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
)

更新于:2022年8月29日

8K+ 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始学习
广告