当前位置: 首页 > 知识库问答 >
问题:

Laravel查询生成器始终获取空数据

高嘉熙
2023-03-14

我对Laravel很陌生,尤其是在从数据库检索东西时。在阅读了他们关于query builder的文档后,我找到了一个部分,其中显示了执行我所需操作的示例代码:

如果不需要整行,可以使用value方法从记录中提取单个值。此方法将直接返回列的值:

$email=DB::table('users'))-

因此,我更改了我需要的表和值:

$loginID = DB::table('logins')->where('email', $email)->value('id');

我目前正在处理注册,当用户注册时,RegisteredUserController.php将运行。但是,它会因以下错误而崩溃:

QLSTATE[HY000]:一般错误: 1364字段'loginID'没有默认值(SQL:插入到用户名称地址irdNum电话updated_atcreated_at)值(Tessa Jewels,107a Allum Street,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);
    }
}

在这个项目中,Login模型被用来进行身份验证,而不是Laravel进行身份验证的常规方式。我知道把它作为身份验证的默认值会容易得多,但我也想学习事情是如何工作的,这样做教会了我很多。

此外,它将事情保存到我的数据库中。例如,如果我摆脱了用户代码,只有创建登录,然后注册,我就可以立即通过PhpMyAdmin在我的数据库中看到这个条目。它似乎只是在检索任何东西上有问题。

问题说明

$email = $request->email;
$loginID = DB::table('logins')->where('email', $email)->value('id');

请求通过表单发送,其中一个输入是电子邮件。因此,用户填写他们的详细信息,并生成一个登录条目,保存他们的电子邮件和密码。之后,我提取它是哪个条目(通过在数据库中搜索logins表中与请求电子邮件匹配的条目)并检索其ID。然后在创建用户模型时使用该ID:

$user = User::create([
    'name' => $request->name,
    'address' => $request->address,
    'irdNum' => $request->irdNum,
    'phone' => $request->phone,
    'loginID' => $loginID
]);

$user->save();

但是它抱怨'loginID'=

我的开发环境是由Docker运行4个容器设置的:app(php)、db(mysql)、PhpMyAdmin和webserver(nginx)(如果有帮助的话)。

事实证明$loginID的值是正确的,所以我不太清楚为什么在尝试使用它创建用户模型时会出错。我通过执行dd($loginID)找到了值 如评论中所建议。


共有2个答案

宗政唯
2023-03-14

尝试使用此查询:

$loginID = DB::table('logins')->where('email', $email)->first('id');
呼延鹏云
2023-03-14

用户模型$fillable中,您将logInID更改为loginID

 类似资料:
  • 我正在使用Laravels查询生成器检索带有一些筛选选项的项目列表-我需要在此查询中进行计数: 计算“Freestyle ID”在likes表中出现的次数。 这有可能吗?返回的数据是完美的,我只需要一个自由泳的喜欢量,其中喜欢表中的自由泳ID为空。

  • 我正在尝试获取自定义属性(https://laravel.com/docs/5.5/eloquent-mutators#defining-访问器)从查询中删除。 现在我有: 你ser.php 用户控制器。php 返回 所以问题是:有没有办法也获得view\u url属性?(我用()在内部进行了尝试,但失败了) 我还可以只返回角色名,而不是像您在“return”代码中看到的那样返回整个对象吗?(我想

  • 我有一个问题,使laravel查询: 我想举个例子: 我有这个但不起作用:

  • 我想在查询生成器laravel中orderBy 因为我的是类型 所以当它排序的时候...结果远远不是我想要的... 我的剧本就像这样 我已经试过了 我如何铸造OrderBy查询生成器,以便我可以排序desc

  • 我有一张这样的桌子- 因此,我有一个特殊的数据类型()用于。 原始select查询如下所示- 结果是- 我想在带有查询生成器的Laravel中使用它,以便()这2个点可以来自用户输入。 我所做的是- 但它不起作用。 有人能帮忙吗?

  • 问题内容: 我有一个由一些条件创建的复杂查询,我想从将要执行的构建器对象中获取最终的SQL查询。我可以那样做吗? 问题答案: 您可以执行以下操作: 但是Laravel不会在查询中向您显示参数,因为它们是在准备查询后绑定的。 因此,您也可以执行以下操作: