Laravel 4.2:如何使用 whereIn() 和 with() 获取一对多关系中的项目列表?
Posted
技术标签:
【中文标题】Laravel 4.2:如何使用 whereIn() 和 with() 获取一对多关系中的项目列表?【英文标题】:Laravel 4.2 : How to use whereIn() and with() to get a list of items in a one-to-many relationship? 【发布时间】:2014-08-06 02:22:23 【问题描述】:我想尝试根据他们的对话 ID 显示消息。规则是一个对话有许多消息和一个消息只属于一个对话。
我的尝试
我的控制器中有这个:
public function index()
$from = Input::get('from',null); //timestamp of latest message
$conv_id = Input::get('conv_id'); //get an array of conversation ids
$allmessages = Conversations::whereIn('id',$conv_id)->with('messages');
if(is_null($from))
$messages = $allmessages->orderBy('created_at','desc')->take(10);
else
$messages = $allmessages->where('created_at','>',$from);
return $messages->get()->reverse();
但我收到了错误消息,
"SQLSTATE[42S22]:Column not found: 1054 Unknown column 'messages.conversations_id' in
'where clause'(SQL: select * from `messages` where `messages`.`conversations_id` in (1, 2))",
我似乎无法弄清楚我哪里出错了。代码的改进将是一个奖励。谢谢!
我有两个模型,对话和消息。这些是桌子。出于这个问题的目的,我故意省略了两个表的时间戳列。
对话
+---------+----------+
| id | name |
+---------+----------+
| 1 | haha |
| 2 | hehe |
+---------+----------+
消息
+---------+----------+-----------------+
| user_id | conv_id |body |
+---------+----------+-----------------+
| 1 | 1 |user1 says hi! |
| 2 | 1 |user2 says seen! |
+---------+----------+-----------------+
这是链接这两个模型的函数。
对话模型
public function messages()
return $this->hasMany('Messages');
消息模型
public function conversations()
return $this->belongsTo('Conversations');
【问题讨论】:
【参考方案1】:你的错误信息说
messages.conversations_id
但您的表架构被列为
conv_id
看来您在某处使用了错误的 id 字段(我不知道您在哪里发布了足够的代码 - 但您应该能够找到它。如果没有 - 从您的模型中发布更多代码)。
【讨论】:
【参考方案2】:尝试将消息模型中的关系更改为:
public function conversations()
return $this->belongsTo('Conversations', 'conv_id');
第二个参数指定用作外键的列:默认为“conversations_id”(基于模型名称)。
【讨论】:
以上是关于Laravel 4.2:如何使用 whereIn() 和 with() 获取一对多关系中的项目列表?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Laravel 中将两个分组的 whereIn 子句与 Where not 组合
使用 Laravel 查询构建器方法 whereIn() 和子查询
Laravel Query Builder 在“whereIn”语句的子查询中使用父查询?