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”语句的子查询中使用父查询?

Laravel whereIn 或 whereIn

将 whereIn() 方法与 laravel Eloquent 模型一起使用

如何在Laravel中使用IN查询?