Я использую фреймворк Laravel.
У меня есть 2 таблицы (пользователи и участники). Когда я хочу войти в систему, я получаю сообщение об ошибке:
SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец 'user_email' в 'where clause' (SQL: select * from
members
гдеuser_email
=? Limit 1) (Bindings: array (0 => 'test@hotmail.com', ))
Пользователи таблицы
CREATE TABLE IF NOT EXISTS `festival_aid`.`users` ( `user_id` BIGINT NOT NULL AUTO_INCREMENT, `user_email` VARCHAR(45) NOT NULL, `user_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `user_modified` TIMESTAMP NULL, `user_deleted` TIMESTAMP NULL, `user_lastlogin` TIMESTAMP NULL, `user_locked` TIMESTAMP NULL, PRIMARY KEY (`user_id`), UNIQUE INDEX `user_email_UNIQUE` (`user_email` ASC), ENGINE = InnoDB;
Участники таблицы
CREATE TABLE IF NOT EXISTS `festival_aid`.`members` ( `member_id` BIGINT NOT NULL AUTO_INCREMENT, `member_password` CHAR(32) NOT NULL, `member_salt` CHAR(22) NOT NULL, `member_token` VARCHAR(128) NULL, `member_confirmed` TIMESTAMP NULL, `user_id` BIGINT NOT NULL, PRIMARY KEY (`member_id`, `user_id`), INDEX `fk_members_users1_idx` (`user_id` ASC), CONSTRAINT `fk_members_users1` FOREIGN KEY (`user_id`) REFERENCES `festival_aid`.`users` (`user_id`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB;
Пользователь миграции
public function up() { Schema::table('users', function(Blueprint $table) { $table->increments('user_id'); $table->string('user_email'); $table->timestamp('user_created'); $table->timestamp('user_modified'); $table->timestamp('user_deleted'); $table->timestamp('user_lastlogin'); $table->timestamp('user_locked'); }); }
Участник миграции
public function up() { Schema::table('members', function(Blueprint $table) { $table->increments('member_id'); $table->string('member_password'); $table->string('member_salt'); $table->string('member_token'); $table->foreign('user_id') ->references('id')->on('users'); //->onDelete('cascade'); $table->timestamp('member_confirmed'); }); }
Пользователь модели
class User extends Eloquent { protected $table = 'users'; /** * The primary key for the model. * * @var string */ protected $primaryKey = 'user_id'; public $timestamps = false; }
Участник модели
use Illuminate\Auth\UserInterface; use Illuminate\Auth\Reminders\RemindableInterface; class Member extends Eloquent implements UserInterface, RemindableInterface { protected $table = 'members'; /** * The attributes excluded from the model's JSON form. * * @var array */ protected $hidden = array('member_password'); /** * Get the unique identifier for the user. * * @return mixed */ public function getAuthIdentifier() { return $this->getKey(); } /** * Get the password for the user. * * @return string */ public function getAuthPassword() { return $this->member_password; } /** * Get the e-mail address where password reminders are sent. * * @return string */ public function getReminderEmail() { return $this->email; } /** * The primary key for the model. * * @var string */ protected $primaryKey = 'member_id'; public $timestamps = false; public function users() { return $this->hasOne('User'); } }
Модель участника использует: use Illuminate \ Auth \ UserInterface;
<?php namespace Illuminate\Auth; interface UserInterface { /** * Get the unique identifier for the user. * * @return mixed */ public function getAuthIdentifier(); /** * Get the password for the user. * * @return string */ public function getAuthPassword(); }
контроллер
public function store() { $input = Input::all(); $rules = array('user_email' => 'required', 'member_password' => 'required'); $v = Validator::make($input, $rules); if($v->passes()) { $credentials = array('user_email' => $input['user_email'], 'member_password' => $input['member_password']); if(Auth::attempt($credentials)) { return Redirect::to('/home'); } else { return Redirect::to('login'); } } else { return Redirect::to('login')->withErrors($v); } }
auth.php
return array( /* |-------------------------------------------------------------------------- | Default Authentication Driver |-------------------------------------------------------------------------- | | This option controls the authentication driver that will be utilized. | This drivers manages the retrieval and authentication of the users | attempting to get access to protected areas of your application. | | Supported: "database", "eloquent" | */ 'driver' => 'eloquent', /* |-------------------------------------------------------------------------- | Authentication Model |-------------------------------------------------------------------------- | | When using the "Eloquent" authentication driver, we need to know which | Eloquent model should be used to retrieve your users. Of course, it | is often just the "User" model but you may use whatever you like. | */ 'model' => 'Member', /* |-------------------------------------------------------------------------- | Authentication Table |-------------------------------------------------------------------------- | | When using the "Database" authentication driver, we need to know which | table should be used to retrieve your users. We have chosen a basic | default value but you may easily change it to any table you like. | */ 'table' => 'members', /* |-------------------------------------------------------------------------- | Password Reminder Settings |-------------------------------------------------------------------------- | | Here you may set the settings for password reminders, including a view | that should be used as your password reminder e-mail. You will also | be able to set the name of the table that holds the reset tokens. | | The "expire" time is the number of minutes that the reminder should be | considered valid. This security feature keeps tokens short-lived so | they have less time to be guessed. You may change this as needed. | */ 'reminder' => array( 'email' => 'emails.auth.reminder', 'table' => 'password_reminders', 'expire' => 60, ), );
Что я здесь делаю неправильно?
Вы настроили auth.php
и используемых members
для аутентификации, но в таблице members
нет поля user_email
поэтому, говорит Ларавел
SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец 'user_email' в 'where clause' (SQL: select * from members, где user_email =? Limit 1) (Bindings: array (0 => 'test@hotmail.com', ))
Потому что он пытается сопоставить user_email
в таблице members
и его нет. Согласно вашей конфигурации auth
, laravel
использует таблицу members
для аутентификации, а не таблицы users
.
У вас нет поля с именем user_email
в таблице участников … почему я не уверен, что код «выглядит», как будто он должен пытаться присоединиться к различным полям
Использует ли метод Auth :: try соединение схемы? Запустите grep -Rl 'class Auth' /path/to/framework
и найдите, где находится метод grep -Rl 'class Auth' /path/to/framework
и что он делает.
Попробуйте изменить, где класс участника
public function users() { return $this->hasOne('User'); } return $this->belongsTo('User');