【发布时间】:2021-10-22 11:59:13
【问题描述】:
我对 Laravel 很陌生,尤其是在从数据库中检索内容时。在阅读了他们关于查询生成器的文档后,我找到了一个部分,其中显示了示例代码,可以完全按照我的need:
如果您不需要整行,您可以从 使用值方法记录。该方法将返回值 直接列:
$email = DB::table('users')->where('name', 'John')->value('email');
所以,我把表格和值换成了我需要的:
$loginID = DB::table('logins')->where('email', $email)->value('id');
我目前正在处理注册,当用户注册时,RegisteredUserController.php 运行。但是,它会因错误而崩溃:
QLSTATE[HY000]:一般错误:1364 字段 'loginID' 没有 默认值(SQL:插入
users(name,address,irdNum,phone、updated_at、created_at) 值(Tessa Jewels,107a Allum 街道, 222222, 0275502217, 2021-08-21 05:28:37, 2021-08-21 05:28:37))
在查看 Stack Overflow 上的其他帖子后,似乎当表不可为空并且您将空值传递给它时会发生该错误。
以下是我的课程:
用户迁移文件
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->bigIncrements('id');
$table->string('name', 45);
$table->mediumText('address');
$table->string('irdNum');
$table->integer('phone');
$table->bigInteger('loginID')->unsigned()->index();
$table->timestamps();
});
Schema::table('users', function($table) {
$table->foreign('loginID')->references('id')->on('logins')
->onUpdate('cascade')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}
登录迁移文件
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateLoginsTable extends Migration
{
public function up()
{
Schema::create('logins', function (Blueprint $table) {
$table->id();
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('logins');
}
}
登录模式
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class Login extends Authenticatable
{
use HasFactory,Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'email',
'password'
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password',
'remember_token',
];
}
用户模型
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
use HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name',
'address',
'irdNum',
'phone',
'logInID'
];
}
注册用户控制器
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\Login;
use App\Models\User;
use App\Providers\RouteServiceProvider;
use Illuminate\Auth\Events\Registered;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rules;
use Illuminate\Support\Facades\DB;
class RegisteredUserController extends Controller
{
/**
* Display the registration view.
*
* @return \Illuminate\View\View
*/
public function create()
{
return view('auth.register');
}
/**
* Handle an incoming registration request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*
* @throws \Illuminate\Validation\ValidationException
*/
public function store(Request $request)
{
$request->validate([
'name' => 'required|string|max:255',
'address' => 'required|string|max:500',
'irdNum' => 'required|string|max:12',
'phone' => 'required|string|max:16',
'email' => 'required|string|email|max:255|unique:logins',
'password' => ['required', 'confirmed', Rules\Password::defaults()],
]);
$login = Login::create([
'email' => $request->email,
'password' => Hash::make($request->password)
]);
event(new Registered($login));
$email = $request->email;
$loginID = DB::table('logins')->where('email', $email)->value('id');
if (is_null($loginID)) {
$loginID = 123;
}
$user = User::create([
'name' => $request->name,
'address' => $request->address,
'irdNum' => $request->irdNum,
'phone' => $request->phone,
'loginID' => $loginID
]);
$user->save();
Auth::login($login);
return redirect(RouteServiceProvider::HOME);
}
}
在这个项目中,登录模型被用来进行身份验证,而不是 Laravel 的常规方式。我知道将其保留为身份验证的默认设置会容易得多,但我也想了解事情的工作原理,这样做教会了我很多。
此外,它可以完美地保存到我的数据库中。例如,如果我摆脱了用户代码并且只有创建登录然后注册,那么我可以立即通过 PhpMyAdmin 在我的数据库中看到该条目。它似乎在检索任何内容时遇到问题。
问题说明
$email = $request->email;
$loginID = DB::table('logins')->where('email', $email)->value('id');
请求是从表单发送的,其中一个输入是电子邮件。因此,用户填写他们的详细信息并生成一个登录条目来保存他们的电子邮件和密码。之后,我提取它是哪个条目(通过在数据库中搜索登录表中与请求电子邮件匹配的条目)并检索其 ID。然后在创建用户模型时使用该 ID:
$user = User::create([
'name' => $request->name,
'address' => $request->address,
'irdNum' => $request->irdNum,
'phone' => $request->phone,
'loginID' => $loginID
]);
$user->save();
但它抱怨'loginID' => $loginID 行,这就是错误弹出的时候。由于我们创建了登录表并使用完全相同的变量 ($request->email;) 成功地将其保存到数据库中,因此它应该返回 ID,但返回 NULL。
我的开发环境设置为运行 4 个容器的 Docker:app(php)、db(mysql)、PhpMyAdmin 和 webserver(nginx),如果有帮助的话。
事实证明 $loginID 具有正确的值,所以我不太清楚为什么在尝试使用它创建用户模型时会出错。我按照 cmets 中的建议通过 dd($loginID); 找到了价值。
【问题讨论】:
-
试试 dd($loginID);看看变量是否有一些价值
-
这正是我一直在寻找的命令,谢谢!事实证明 loginID 确实具有正确的值,因此当我尝试在创建用户模型时使用它时它为什么会抱怨是没有意义的。
-
在受保护的可填写字段中将 logInID 设为 loginID。是不是错字了?
-
嗯,原来是这样哈哈。谢谢大家的帮助,真的很感激。
标签: php mysql laravel laravel-query-builder