Laravel 5 Eloquent 关系 "Has Many Through" SQL 异常
Laravel 5 Eloquent relation "Has Many Through" SQL Exception
您好。昨天我花了6个多小时来了解laravel 5中的ORM关系是如何工作的。但我还不是很熟悉。
经过数百个错误、测试、研究等...我使我的一部分关系正常工作。
模型之间的关系:
/* User.php (Model) */
public function lists() {
return $this->hasMany('App\ListModel');
}
public function tasks() {
return $this->hasManyThrough('App\Task', 'App\ListModel',
'user_id', 'list_id');
}
/* ListModel.php */
protected $table = 'lists';
public function user() {
return $this->belongsTo('\App\User', 'list_id');
}
public function tasks() {
return $this->hasMany('App\Task', 'list_id');
}
/* Task.php (Model) */
public function listModel() {
return $this->belongsTo('App\ListModel', 'list_id');
}
在控制器中工作的内容:
/* Returning all tasks (I have only one user yet. All tasks belongs to him) */
$request->user()->tasks()->get();
/* Working - Returning the list | lists */
$list = $request->user()->lists()->where('id', 'some-id')->first();
$lists = $request->user()->lists()->get();
发生异常的地方
/* Next line throws the SQL Exception */
$task = $request->user()->tasks()->where('id', '5')->first();
异常:
SQLSTATE[23000]:
Integrity constraint violation: 1052
Column 'id' in where clause is ambiguous
(SQL: select `tasks`.*, `lists`.`user_id` from `tasks`
inner join `lists` on `lists`.`id` = `tasks`.`list_id` where
`tasks`.`deleted_at` is null and `lists`.`deleted_at` is null
and `lists`.`user_id` = 1 and `id` = 5 limit 1)
/* The problem in where clause ^^^^^^^ */
laravel 生成的 SQL 查询无效。我觉得id
的table一定要定义
注意:ListModel
class使用protected $table = 'lists'
。 List
单词在 PHP (T_LIST) 中是母语 。 table 名称更改让我的日子很不舒服。 Laravel 关于 "ORM custom keys" 的文档有点小。
感谢您的宝贵时间。
问题实际上出在 QueryBuilder
。
$request->user()->tasks()
Returns QueryBuilder
我不确定它是如何工作的。但我认为 where()
函数增加了额外的 SQL.
解决方法:
我更改了这一行:
$task = $request->user()->tasks()->where('id', '5')->first();
收件人:
$task = $request->user()->tasks()->where('tasks.id', '5')->first();
其中 tasks
是数据库中的 table,id
是列。
您好。昨天我花了6个多小时来了解laravel 5中的ORM关系是如何工作的。但我还不是很熟悉。
经过数百个错误、测试、研究等...我使我的一部分关系正常工作。
模型之间的关系:
/* User.php (Model) */
public function lists() {
return $this->hasMany('App\ListModel');
}
public function tasks() {
return $this->hasManyThrough('App\Task', 'App\ListModel',
'user_id', 'list_id');
}
/* ListModel.php */
protected $table = 'lists';
public function user() {
return $this->belongsTo('\App\User', 'list_id');
}
public function tasks() {
return $this->hasMany('App\Task', 'list_id');
}
/* Task.php (Model) */
public function listModel() {
return $this->belongsTo('App\ListModel', 'list_id');
}
在控制器中工作的内容:
/* Returning all tasks (I have only one user yet. All tasks belongs to him) */
$request->user()->tasks()->get();
/* Working - Returning the list | lists */
$list = $request->user()->lists()->where('id', 'some-id')->first();
$lists = $request->user()->lists()->get();
发生异常的地方
/* Next line throws the SQL Exception */
$task = $request->user()->tasks()->where('id', '5')->first();
异常:
SQLSTATE[23000]:
Integrity constraint violation: 1052
Column 'id' in where clause is ambiguous
(SQL: select `tasks`.*, `lists`.`user_id` from `tasks`
inner join `lists` on `lists`.`id` = `tasks`.`list_id` where
`tasks`.`deleted_at` is null and `lists`.`deleted_at` is null
and `lists`.`user_id` = 1 and `id` = 5 limit 1)
/* The problem in where clause ^^^^^^^ */
laravel 生成的 SQL 查询无效。我觉得id
的table一定要定义
注意:ListModel
class使用protected $table = 'lists'
。 List
单词在 PHP (T_LIST) 中是母语 。 table 名称更改让我的日子很不舒服。 Laravel 关于 "ORM custom keys" 的文档有点小。
感谢您的宝贵时间。
问题实际上出在 QueryBuilder
。
$request->user()->tasks()
Returns QueryBuilder
我不确定它是如何工作的。但我认为 where()
函数增加了额外的 SQL.
解决方法:
我更改了这一行:
$task = $request->user()->tasks()->where('id', '5')->first();
收件人:
$task = $request->user()->tasks()->where('tasks.id', '5')->first();
其中 tasks
是数据库中的 table,id
是列。