首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字段“activation_token”没有默认值

问字段“activation_token”没有默认值
EN

Stack Overflow用户
提问于 2019-07-13 07:59:39
回答 2查看 2.5K关注 0票数 1

我使用laravel/passport在laravel中进行身份验证。护照的activation_token列应该是随机字符串。当我在应用程序中注册时,我会得到以下错误:

照明\数据库\ QueryException (HY000) SQLSTATEHY000:一般错误: 1364字段'activation_token‘没有默认值(SQL: insert insert users (name,email,password,updated_at,created_at)值)值(Alireza,armazochi@gmail.com,updated_at2019-07:36:18,2019-07-1307:36:18)

在AuthController.php中,我定义名称、密码、电子邮件和activation_token的值。字段名、电子邮件、密码正确保存在数据库中,但activation_token不发送到sql查询和错误记录:

$2y$10$gy2g4uQJPlX/1HneLEDei.b/BSHrv5B302ifQHPN0G6wbvYnjOiau,SQLSTATEHY000:一般错误: 1364字段“activation_token”没有默认值(SQL: insert insert users (name,email,password,updated_at,created_at)值(Alireza,armazochi@gmail.com,Alireza 07-13 07:36:18,2019-07-13 07:36:18))

我将列activation_token更改为$table->string('activation_token')->default(null)->nullable();,它起了作用,显示与此部分相关的错误。为什么activation_token没有得到随机值?

User.php:

代码语言:javascript
复制
<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Database\Eloquent\SoftDeletes;
use Laravel\Passport\HasApiTokens;


class User extends Authenticatable
{
    use Notifiable;
    use SoftDeletes;
    use HasApiTokens;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password', 'active', 'activation_token',
    ];

    protected $dates = ['deleted_at'];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token', //'activation_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

2014_10_12_000000_create_users_table.php:

代码语言:javascript
复制
 <?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Str;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('activation_token');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->boolean('active')->default(false);
            $table->rememberToken();
            $table->timestamps();

            $table->softDeletes();
        });
    }



    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

AuthController.php:

代码语言:javascript
复制
<?php

namespace App\Http\Controllers;

use App\Notifications\SignupActivate;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;
use App\User;
use Illuminate\Support\Str;


class AuthController extends Controller
{
    /**
     * Create user
     *
     *
    @param  [string] name
     *
    @param  [string] email
     *
    @param  [string] password
     *
    @param  [string] password_confirmation
     *
    @return [string] message
     */
    public function signup(Request $request)
    {
        $request->validate([
            'name' => 'required|string',
            'email' => 'required|string|email|unique:users',
            'password' => 'required|string|confirmed'
        ]);
        $user = new User([
            'name' => $request->name,
            'activation_token' => Str::random(60),
            'email' => $request->email,
            'password' => bcrypt($request->password),
        ]);
        $user->save();
        $user->notify(new SignupActivate($user));

        return response()->json([
            'message' => 'Successfully created user!'
        ], 201);
    }

    /**
     * Login user and create token
     *
     *
    @param  [string] email
     *
    @param  [string] password
     *
    @param  [boolean] remember_me
     *
    @return [string] access_token
     *
    @return [string] token_type
     *
    @return [string] expires_at
     */
    public function login(Request $request)
    {
        $request->validate([
            'email' => 'required|string|email',
            'password' => 'required|string',
            'remember_me' => 'boolean'
        ]);
        $credentials = request(['email', 'password']);
        $credentials['active'] = 1;
        $credentials['deleted_at'] = null;
        if(!Auth::attempt($credentials))
            return response()->json([
                'message' => 'Unauthorized'
            ], 401);
        $user = $request->user();
        $tokenResult = $user->createToken('Personal Access Token');
        $token = $tokenResult->token;
        if ($request->remember_me)
            $token->expires_at = Carbon::now()->addWeeks(1);
        $token->save();
        return response()->json([
            'access_token' => $tokenResult->accessToken,
            'token_type' => 'Bearer',
            'expires_at' => Carbon::parse(
                $tokenResult->token->expires_at
            )->toDateTimeString()
        ]);
    }

    /**
     * Logout user (Revoke the token)
     *
     *
    @return [string] message
     */
    public function logout(Request $request)
    {
        $request->user()->token()->revoke();
        return response()->json([
            'message' => 'Successfully logged out'
        ]);
    }

    /**
     * Get the authenticated User
     *
     *
    @return [json] user object
     */
    public function user(Request $request)
    {
        return response()->json($request->user());
    }


    public function signupActivate($token)
    {
        $user = User::where('activation_token', $token)->first();
        if (!$user) {
            return response()->json([
                'message' => 'This activation token is invalid.'
            ], 404);
        }
        $user->active = true;
        $user->activation_token = '';
        $user->save();
        return $user;
    }

}
EN

回答 2

Stack Overflow用户

发布于 2019-07-13 08:32:27

这是一个MySQL错误,因为您的数据库字段没有默认值集,并且没有为该属性传递值。

可以在表架构设置中设置默认值,例如NULL。

或者,您可以在Laravel中禁用MySQL strict模式。

/config/database.php

代码语言:javascript
复制
'mysql' => [
    ...
    'strict' => false,
    ...
],
票数 0
EN

Stack Overflow用户

发布于 2019-07-13 10:32:05

在您的迁移中,您可以这样做以使该列为空:

代码语言:javascript
复制
$table->string('activation_token')->nullable($value = true); 

允许(默认情况下)将空值插入列中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57017271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档