从laravel查询中获取未知列Eloquent

时间:2016-12-23 11:59:09

标签: php laravel laravel-5.3

我正在尝试用户和otp之间的一对多关系,但我收到了一个未知的列错误。 我正在使用Sentinel进行用户身份验证。

Otp模型

$mime = exec("file $tmpFilePath -z -b --mime-type");

Sentinel用户模型。

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Sentinel;

class Otp extends Model
{

    protected $fillable = ['user_id','phonenumber','otp'];

    public function user()
    {
      return $this->belongsTo(Sentinel);
    }
}

otp架构

namespace Cartalyst\Sentinel\Users;

........
.......

    protected $table = 'users';

    /**
     * {@inheritDoc}
     */
    protected $fillable = [
        'username',
        'password',
        'permissions',
        'relationship',
        'status',
        'phone'
    ];


    public function otp()
    {
        return $this->hasMany('App\Otp');
    }

.....

哨兵用户架构。

  Schema::create('otps', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id')->unsigned();
            $table->string('phonenumber');
            $table->string('otp');
            $table->timestamps();
            $table->foreign('user_id')->references('id')->on('users')
            ->onDelete('cascade')
            ->onUpdate('cascade');
        });

所以我接受用户的请求,其中包含他的电话号码,我试图将其存储在otp表中

    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');

        $table->string('username');
        $table->string('password');

        $table->string('name')->nullable();
        $table->bigInteger('phone')->nullable();
        $table->integer('birth_month')->nullable();
        $table->integer('birth_year')->nullable();
        $table->integer('birth_day')->nullable();
        $table->integer('relationship')->unsigned();
        $table->integer('status')->nullable();

        $table->text('permissions')->nullable();
        $table->timestamp('last_login')->nullable();

        $table->timestamps();

        $table->engine = 'InnoDB';
        $table->unique('username');
    });

但是会出现错误

public function phoneupdate(Request $request){

  $this->validate($request, [
      'phone' => 'bail|required|numeric|digits:10',
  ]);

  $user = Sentinel::findById(3);

  $randomOtp = rand (999 ,10000);

  $user->otp()->create([
    'phonenumber' => $request->phone,
    'otp' => $randomOtp,
  ]);

  return 'OK';
}

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'eloquent_user_id' in 'field list' (SQL: insert into `otps` (`phonenumber`, `otp`, `eloquent_user_id`, `updated_at`, `created_at`) values (1234567890, 5997, 3, 2016-12-23 11:34:55, 2016-12-23 11:34:55)) 问题需要eloquent_user_id而不是user_id但是根据laravel文档,默认情况下它会使用外键eloquent_user_id,所以它为什么要这样做错误

如果我改变

,代码工作正常

user_id

public function otp()
{
  return $this->hasMany('App\Otp');
}

为什么我需要定义public function otp() { return $this->hasMany('App\Otp','user_id'); } ,如果它默认来自user_id

1 个答案:

答案 0 :(得分:1)

由于您传递的是Sentinel而非用户类,因此您可能需要发送已加入的列。

public function user()
{
  return $this->belongsTo(Sentinel, 'id', 'user_id');
}

如果这不起作用,请尝试将该列添加到Sentinel \ User类。

public function otp()
{
    return $this->hasMany('App\Otp', 'user_id');
}

深入了解源代码,UserInterface使用模型Cartalyst\Sentinel\Users\EloquentUser,因此使用该模型名称来确定外键。