hasmanythrough 关系不起作用

Posted

技术标签:

【中文标题】hasmanythrough 关系不起作用【英文标题】:hasmanythrough relation not working 【发布时间】:2014-05-12 08:21:16 【问题描述】:

我正在使用 laravel 创建一个消息传递应用程序。我使用了四个迁移(用户、对话、对话成员和对话回复)。我还定义了模型之间的关系。

用户的详细信息将存储在用户表中。对话 ID 将存储在对话表中。每个对话都会有成员。成员的详细信息将存储在会话成员表中,最后回复将存储在会话回复表中。

现在我试图显示特定用户的所有对话(我在 User 和 ConversationMembers 模型之间使用了 hasManyThrough 关系),但它不起作用。

详情如下:

用户迁移:

$table->increments('id');

$table->string('name', 32);
$table->string('username', 32);
$table->string('email', 320);
$table->string('password', 64);

$table->timestamps();

对话迁移:

$table->increments('id');
$table->timestamps();

conversationsmembers 迁移:

$table->increments('id');

$table->integer('conversation_id');
$table->integer('user_id'); 

$table->timestamps();

对话回复迁移

$table->increments('id');

$table->integer('conversation_id');
$table->integer('user_id'); 

$table->timestamps();

用户模型: 我已将这些方法添加到默认用户模型中

public function conversations()
    
        return $this->hasManyThrough('Conversation', 'ConversationsMember', 'conversation_id', 'id');
    

    public function conversationsMember()
        return $this->hasMany('ConversationsMember', 'user_id', 'id');
    


    public function conversationsReply()
        return $this->hasMany('ConversationsReply', 'user_id', 'id');
    

对话模型

class Conversation extends Eloquent


    public function conversationsMember()
        return $this->hasMany('ConversationsMember', 'conversation_id', 'id');
    
    public function conversationsReply()
        return $this->hasMany('ConversationReply');
    

ConversationsMember 模型

    class ConversationsMember extends Eloquent

        protected $fillable = array('conversation_id', 'user_id');

        protected $table = 'conversationsmember';

        public function users()
            return $this->belongsTo('User', 'user_id', 'id');
        

        public function conversations()
            return $this->belongsTo('Conversation', 'conversation_id', 'id');
        


对话回复模型

class ConversationsReply extends Eloquent

    protected $fillable = array('reply', 'user_id','conversation_id', 'ip');

    protected $table = 'conversationsreply';

    public function users()
        return $this->belongsTo('User', 'user_id', 'id');
    

    public function conversations()
        return $this->belongsTo('Conversation', 'conversation_id', 'id');
    

【问题讨论】:

可能值得解释一下“不工作”的含义。错误?没有结果?奇怪的结果? 当我通过用户模型调用对话方法时,什么都没有发生。我使用 print_r 查看结果,它显示了两个大括号() 好吧,看看你的架构和代码,你似乎要么错误地使用了hasManyThrough,要么错误地建模了你的数据。据我了解,hasManyThroughX 有很多Y 时使用,然后Y 有很多Z 并且您想为给定的X 获取所有Zs。因此,您的架构需要在Y 上拥有x_id,在Z 上拥有y_id。如果这不是您要查找的内容,但实际上X 有很多Y 并且Y 有很多X,那么您需要belongsToMany 而不是hasManyThrough。根据您的架构(您有一个数据透视表),后者似乎是您想要的。也许试试看。 对于表格和列的拼写(和复数形式),请务必关注the conventions。 @alexrussell,我认为是 X hasOne Y,Y hasMany Z。检查这个其他答案***.com/questions/22720311/… 【参考方案1】:

我在这里可能错了,但从你写的内容看来,你可以用更简单的方式编写代码。

我建议您考虑使用 ConversationMembers 作为用户和对话之间的数据透视表,定义多对多关系。您可以找到您正在寻找的所有信息here。

【讨论】:

以上是关于hasmanythrough 关系不起作用的主要内容,如果未能解决你的问题,请参考以下文章

laravel hasmanythrough on manytomany

OneToMany 关系不起作用

Laravel Lighthouse Graphql HasOne 嵌套关系不起作用

Laravel - 自引用关系不起作用

Laravel 雄辩的关系多对一不起作用

Laravel 5.6 OneToOne 关系不起作用