【问题标题】:Laravel query builder always fetches null dataLaravel 查询构建器总是获取空数据
【发布时间】: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:插入usersnameaddressirdNumphoneupdated_atcreated_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' =&gt; $loginID 行,这就是错误弹出的时候。由于我们创建了登录表并使用完全相同的变量 ($request-&gt;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


【解决方案1】:

在用户模型 $fillable 中,您将 logInID 更改写入 loginID

【讨论】:

  • 经过 4 小时的尝试整理,结果是这样的。一个不应该大写的字母。哦,我的哈哈。
  • :))))) 当你在查询中看不到列名并且你没有得到任何你必须知道的异常时,可填充是一个问题......你可以检查您使用 DB::enableQueryLog(); 查询// 启用查询日志 // 你的 Eloquent 查询使用 get() dd(DB::getQueryLog()); // 显示日志结果stackoverflow.com/questions/18236294/…
【解决方案2】:

尝试使用此查询:

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

【讨论】:

    猜你喜欢
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 2021-09-25
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多