Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel获取与当前用户参与的参与者的所有对话_Php_Eloquent_Laravel 5.4 - Fatal编程技术网

Php Laravel获取与当前用户参与的参与者的所有对话

Php Laravel获取与当前用户参与的参与者的所有对话,php,eloquent,laravel-5.4,Php,Eloquent,Laravel 5.4,我有四张桌子。用户、对话、消息和对话参与者。 我希望您在这张图片中没有发现关系错误 我试图添加一个函数 public function conversations(){ return $this->belongsToMany(Conversation::class, 'conversation_participants', 'user_id', 'conversation_id'); } 到User::class,但如果我调用User::with'conversations'-

我有四张桌子。用户、对话、消息和对话参与者。 我希望您在这张图片中没有发现关系错误

我试图添加一个函数

public function conversations(){

    return $this->belongsToMany(Conversation::class, 'conversation_participants', 'user_id', 'conversation_id');
}
到User::class,但如果我调用User::with'conversations'->get,我只会获取所有现有用户。我做错了什么?首先,我想获取当前用户参与的所有对话,其次,我想获取对话的所有接收者

我也试过了

public function participants()
{
    return $this->belongsToMany(User::class, 'conversation_participants', 'user_id', 'conversation_id');
}
在对话::类中,但对话::with'participants'->获取所有对话,即使用户没有参与

我真的很困惑atm:///p>调用User::with'conversations'->get并没有指定用户。我可能误读了,但我认为您正在寻找以下内容:

$user = User::with('conversations')->find(1);
$userConversations = $user->conversations;
它将为您提供用户及其对话。

在您的用户模型中添加以下内容:

这就是你的谈话模式:

如果希望更轻松地链接表

若要获取用户正在参与的所有对话,请在已加载用户的情况下运行以下命令:$user->conversations以获取用户正在参与的所有对话

如果希望所有用户及其所有对话都与所有参与者连接,请执行以下操作:$users=users::with'conversations.participants'->get。现在,您可以按如下方式循环执行此操作:

foreach($users as $user) {
    foreach($user->conversations as $conversation) { 
        foreach($conversations->participants as $participant) {
            // do fancy stuff here
        }
    }
}
请注意,您开始的用户也是参与者,因此可能需要再次筛选出该用户

如果你想变得更花哨,但使用更多的资源,你甚至可以查询对话中的所有消息

User::with('conversations.participants', 'conversations.messages.user')->get()
但这仅在图像对话消息用户中沿上表设置第二组关系时有效

编辑

在评论中,OP询问是否可以限制从数据库检索的邮件数量(据我所知),但我现在不知道这是否是最好的方法:

从第一个加载部件中删除消息:

User::with('conversations.participants')
之后,在对话中循环时,延迟加载消息:

$conversation->load(['messages' => function($query){
    $query->take(5);
}, 'users']);
然后通过$conversation->messages访问它们

我认为这可以更容易地一次完成,但我现在没有一个设置来测试这一点

编辑2

在Ronon添加另一条评论后,我想到了以下几点:

在对话模型中添加新关系:

因此,您现在可以执行以下操作:

User::with('conversations.participants', 'conversations.last_messages.users')->get()

如果仍然需要所有消息,可以使用消息关系。如果您想要更少,请使用最后一条消息。

请尝试更改您的参与方返回$this->belongtomanyapp\User、'conversation\u participants'、'conversation\u id'、'User\u id';。然后在控制器User::with'participants'->get中进行尝试;不需要最后一行的括号,这只会使您回到查询模式。其余的,请注意!哇,谢谢你。包含消息的部分将在接下来的步骤中进行。但是有没有办法限制加载的消息?例如,是否仅加载最后5条消息?邮件也有$table->timestamps attr,所以排序不是问题。@Ronon现在在上面谢谢:我可能找到了一个[更好的?]解决方案。在对话->消息功能中,我刚刚添加了hasManyMessage::class->latest->limit2。似乎工作如愿。不知道是好是坏。如果您能对此做出回应,我将不胜感激,即使我的主要问题已经解决了。
$conversation->load(['messages' => function($query){
    $query->take(5);
}, 'users']);
public function last_messages() {
    return $this->hasMany(Message::class, 'conversation_id', 'id')->latest()->limit(2);
}
User::with('conversations.participants', 'conversations.last_messages.users')->get()