Laravel 5.2 - Sử dụng chuỗi làm Khóa chính tùy chỉnh cho Bảng Eloquent trở thành 0


82

Tôi đang cố gắng sử dụng email làm khóa chính của bảng, vì vậy mã hùng hồn của tôi là-

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class UserVerification extends Model
{
    protected $table = 'user_verification';
    protected $fillable =   [
                                'email',
                                'verification_token'
                            ];
    //$timestamps = false;
    protected $primaryKey = 'verification_token';
}

Và DB của tôi là như thế này-

nhập mô tả hình ảnh ở đây

nhưng nếu tôi làm điều này-

UserVerification::where('verification_token', $token)->first();

Tôi đang nhận được điều này-

{
  "email": "sdfsdf@sdfsdf.sdf",
  "verification_token": 0,
  "created_at": "2016-01-03 22:27:44",
  "updated_at": "2016-01-03 22:27:44"
}

Vì vậy, mã xác minh / khóa chính trở thành 0.

Có ai giúp đuợc không?

Câu trả lời:


181

Điều này đã được thêm vào tài liệu nâng cấp vào ngày 29 tháng 12 năm 2015 , vì vậy nếu bạn đã nâng cấp trước đó thì có thể bạn đã bỏ lỡ nó.

Khi tìm nạp bất kỳ thuộc tính nào từ mô hình, nó sẽ kiểm tra xem cột đó có nên được truyền dưới dạng số nguyên, chuỗi, v.v.

Theo mặc định, đối với các bảng tăng tự động, ID được giả định là một số nguyên trong phương pháp này:

https://github.com/laravel/framework/blob/5.2/src/Illuminate/Database/Eloquent/Model.php#L2790

Vì vậy, giải pháp là:

class UserVerification extends Model
{
    protected $primaryKey = 'your_key_name'; // or null

    public $incrementing = false;

    // In Laravel 6.0+ make sure to also set $keyType
    protected $keyType = 'string';
}

3
Có lý do gì khiến $incrementingtrường công khai thay vì được bảo vệ không?
Mubashar Abbas,

5
@MubasharAbbas Vâng, mô hình của bạn phải phù hợp với Eloquent. Bây giờ, tại sao Eloquent lại $incrementingcông khai và $primaryKeyđược bảo vệ? Nó khá tùy tiện. Tôi đoán $incrementingkhông có phương pháp getter hoặc setter trong các phiên bản trước đó của hùng biện (nó bây giờ không) và họ chỉ không muốn thực hiện một thay đổi phá vỡ sau khi thêm chúng vào
andrewtweber

1
Nếu bạn không có khóa chính (hoặc phím composite, mà không được hỗ trợ bởi hùng biện), và bạn đang cố gắng để lặp bảng như vậy với chunk, bạn có thể phải đối mặt với các lỗi sau: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'example.' in 'order clause'. Trong trường hợp này, bạn cần xác định rõ ràng orderBycâu lệnh mà Eloquent đang cố gắng đính kèm vào truy vấn của bạn bằng khóa chính.
antongorodezkiy

Đáng buồn là đây là những thứ mà Laravel làm ngăn cản tôi yêu hết lòng. Việc phát hiện loại cột (giống như với rất nhiều cột khác) sẽ không hợp lý hơn sao?
Miss Amelia Sara


7

Có hai thuộc tính trên mô hình mà bạn cần đặt. Người đầu tiên $primaryKeycho mô hình biết cột nào sẽ mong đợi khóa chính. Điều thứ hai $incrementingđể nó biết khóa chính không phải là một giá trị tăng tự động tuyến tính.

class MyModel extends Model
{
    protected $primaryKey = 'my_column';

    public $incrementing = false;
}

Để biết thêm thông tin, hãy xem Primary Keysphần trong tài liệu về Eloquent .


1
Nó cần phải public $incrementingphù hợp với lớp cha.
andrewtweber

2

Tôi đang sử dụng Postman để kiểm tra API Laravel của mình.

Tôi đã nhận được một lỗi đã nêu

"SQLSTATE [42S22]: Không tìm thấy cột: 1054 Cột không xác định" vì Laravel đang cố gắng tự động tạo hai cột "create_at" và "updated_at".

Tôi phải nhập public $timestamps = false;mô hình của tôi. Sau đó, tôi thử nghiệm lại với Postman và thấy rằng một "id" = 0biến đang được tạo trong cơ sở dữ liệu của tôi.

Cuối cùng tôi đã phải thêm public $incrementing false;để sửa chữa API của mình.


2

tiếp tục sử dụng id


<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class UserVerification extends Model
{
    protected $table = 'user_verification';
    protected $fillable =   [
                            'id',
                            'email',
                            'verification_token'
                            ];
    //$timestamps = false;
    protected $primaryKey = 'verification_token';
}

và nhận email:

$usr = User::find($id);
$token = $usr->verification_token;
$email = UserVerification::find($token);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.