当前位置: 首页 > 知识库问答 >
问题:

社交网络的Laravel雄辩ORM

公冶伟
2023-03-14

我的状态帖子有以下数据库设置。对于每一篇文章,用户可以喜欢这篇文章,评论这篇文章,甚至可以由作者在原始文章中添加标签。

我试图设置我的足智多谋的控制器后带回所有的数据通过JSON对象,但我不能正确地找到评论,喜欢或标记用户名。如果有区别的话,我会用哨兵2进行认证。

以下是数据库设置:

    CREATE TABLE Users (
        id INT NOT NULL AUTO_INCREMENT,
        first_name VARCHAR(30),
        last_name VARCHAR(30),
        many more...
    );

    CREATE TABLE Posts (
        postID INT NOT NULL AUTO_INCREMENT,
        caption VARCHAR(200), 
        description VARCHAR(200), 
        fromID INT(10) UNSIGNED NOT NULL,
        toID INT(10) UNSIGNED NOT NULL,
        icon VARCHAR(200),
        link VARCHAR(200),
        message TEXT,
        storyType INT,
        type ENUM ('LINK', 'PHOTO', 'STATUSUPDATE', 'VIDEO' ),
        createdTime DATE,
        PRIMARY KEY (postID),
        FOREIGN KEY (fromID) REFERENCES users (id),
        FOREIGN KEY (toID) REFERENCES users (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

    CREATE TABLE Likes (
        likeID INT NOT NULL AUTO_INCREMENT,
        fromID INT(10) UNSIGNED NOT NULL,
        postID INT NOT NULL,
        createdDate DATE,
        PRIMARY KEY (likeID),
        FOREIGN KEY (fromID) REFERENCES users (id),
        FOREIGN KEY (postID) REFERENCES Posts (postID)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

    CREATE TABLE Comments (
        commentID INT NOT NULL AUTO_INCREMENT,
        fromID INT(10) UNSIGNED NOT NULL,
        postID INT NOT NULL,
        comment TEXT,
        createdDate DATE,
        PRIMARY KEY (commentID),
        FOREIGN KEY (fromID) REFERENCES users (id),
        FOREIGN KEY (postID) REFERENCES Posts (postID)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


    CREATE TABLE Tags (
        tagID INT NOT NULL AUTO_INCREMENT,
        userID INT(10) UNSIGNED NOT NULL,
        postID INT NOT NULL,
        PRIMARY KEY (tagID),
        FOREIGN KEY (userID) REFERENCES users (id),
        FOREIGN KEY (postID) REFERENCES Posts (postID)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

我的Post控制器,我只是有一个简单的页面,可以显示所有内容。我不想循环查看文件中的任何内容,我只想返回json完整对象。

class PostController extends BaseController {

    public function show($id)
    {
    $post = Post::with(array('comments', 'from', 'tags', 'likes'))->find($id);
    return View::make('samplepage')->with('data', $post);
    }
}

我的帖子模型:

class Post extends Eloquent {

    protected $table = 'Posts';
    protected $primaryKey = 'postID';

    public function comments() 
    {
       return $this->hasMany('Comment','postID');
     }

     public function tags() 
     {
       return $this->hasMany('Tag','postID');
     }

     public function likes() 
     {
       return $this->hasMany('Like','postID');
     }


    public function from() 
    {
        return $this->belongsTo('User', 'fromID')->select(array('id', 'first_name', 'last_name'));
    }

    public function users() 
    {
        return $this->belongsTo('User', 'fromID');
    }

}

注释模型:类注释扩展了雄辩的{

    protected $table = 'Comments';
    protected $primaryKey = 'commentID';

     public function post() {
       return $this->belongsTo('Post','fromID');
     }

     public function user() {
        return $this->belongsTo('User', 'fromID')->select(array('id', 'first_name', 'last_name'));
    }
}

标记模型:类标记扩展了雄辩的{

    protected $table = 'Tags';
    protected $primaryKey = 'tagID';

}

我甚至在我的用户模型中设置了以下内容,但没有区别。用户模型:

public function posts() {
   return $this->hasMany('Post','id');
 }

public function comments() {
 return $this->hasMany('Comment','id');
}

在这个设置中一切都很好,当我用下面的代码点击posts/2时,我得到了下面的对象$post=post::with(数组('comments','from','tags','likes'))-

{
   postID: "2",
   toID: "8",
   comments: [
      {
         commentID: "2",
         comment: "second comment",
         fromID: "1",
         postID: "2",
         createdDate: "2014-02-15"
      }
   ],
   from: {
      id: "4",
      first_name: Paul,
      last_name: Davis
   },
   tags: [
      {
         tagID: "1",
         userID: "2",
         postID: "2"
      },
      {
         tagID: "2",
         userID: "3",
         postID: "2"
      }
   ],
   likes: [
      {
         likeID: "1",
         fromID: "2",
         postID: "2",
         createdDate: "2013-01-04"
      },
      {
         likeID: "2",
         fromID: "3",
         postID: "2",
         createdDate: "2013-02-05"
      }
   ]
}

但是我想要的是以下内容,其中每个标记,like和注释连接第一个和最后一个名字,并将它们与对象一起返回。

{
   postID: "2",
   toID: "4",
   comments: [
      {
         commentID: "2",
         comment: "second comment",
         fromID: "1",
         from: {
              "name": "Jason Terry", 
              "id": "721286625"
            }, 
         postID: "2",
         createdDate: "2014-02-15"
      }
   ],
   from: {
      id: "4",
      first_name: Paul,
      last_name: Davis
   },
   tags: [
      {
         tagID: "1",
         userID: "2",
         from: {
              "name": "David Lee", 
              "id": "721286625"
            },
         postID: "2"
      },
      {
         tagID: "2",
         userID: "3",
         from: {
              "name": "Paul Pierce", 
              "id": "721286625"
            },
         postID: "2"
      }
   ],
   likes: [
      {
         likeID: "1",
         fromID: "2",
         from: {
              "name": "David Lee", 
              "id": "721286625"
            },
         postID: "2",
         createdDate: "2013-01-04"
      },
      {
         likeID: "2",
         fromID: "3",
         from: {
              "name": "Al Davis", 
              "id": "721286625"
            },
         postID: "2",
         createdDate: "2013-02-05"
      }
   ]
}

我已经搜索了Stackoverflow,无数的Laravel博客和官方文档两周了,我似乎无法解决这个问题。任何帮助都是非常感谢的。

更新:以下是Tony的回答

$post = Post::with(array('comments.users', 'from', 'tags.users', 'likes.users'))->find($id);  

然后我补充说

public function users() 
{ return $this->belongsTo('User', 'fromID')->select(array('id', 'first_name', 'last_name')); 
} 

到评论,标签,和喜欢的模型。这个物体现在工作得很好。

但是我的调试器显示了以下内容

select `id`, `first_name`, `last_name` from `users` where `users`.`id` in ('1')

select `id`, `first_name`, `last_name` from `users` where `users`.`id` in ('4')

select `id`, `first_name`, `last_name` from `users` where `users`.`id` in ('2', '3')

select `id`, `first_name`, `last_name` from `users` where `users`.`id` in ('2', '3')

简而言之,它在MyUsers表上运行4个查询。这不是多余的吗?它不应该对users表进行一次查询,而不是对原始post用户进行一次查询,对comments用户进行一次查询,对tags用户进行一次查询,对likes用户进行一次查询吗?

共有2个答案

林德华
2023-03-14

这是一个小小的老帖子,但你也可以这样做,

public function from() 
    {
        return $this->belongsTo('User', 'fromID')
                    ->select(array('id',DB::raw("CONCAT(firstname,' ', lastname) as name")));
    }
严永丰
2023-03-14

看起来您想要使用嵌套关系。

$post = Post::with('comments.from', 'from', 'tags.from', 'likes.from')->find($id);

您还需要将“from”关系编码到每个模型中。

获取连接的名称;在您的用户模型中需要以下内容

protected $appends = array('name');
protected $hidden = array('first_name', 'last_name');  //this is optional

public function getNameAttribute()
{
    return $this->attributes['first_name'] . ' ' . $this->attributes['last_name'];
}
 类似资料:
  • 社交网络的一大特征就是用户间的相互关注,从而形成朋友圈或媒体圈,实现便捷的信息分享和传播。GitHub支持项目级别及用户级别的关注。 关注一个项目很简单,只需点击项目名称右侧的“Watch”按钮。 图2-27:项目的关注按钮 添加对项目的关注后,点击页面左上角的“github”文字图标进入仪表板(Dashboard)页面,如图2-28所示。 图2-28:关注项目在仪表板页的显示 仪表板页面的左侧显

  • 在有说服力的ORM上,是否有一种较短的方法在Laravel中插入数据? 目前我正在这样做: 就像你看到的,所有的列都像属性一样命名。 我知道您可以将对象与all()函数和fetch()一起使用。但是我从另一个对象(soap服务器)获取数据。 有没有办法转换这个?也许在模型上?

  • 在本章中,让我们研究一下Drupal中的Social Networking 。 社交媒体现在变得非常重要,Drupal为此目的有许多社交媒体模块。 我们以ShareThis模块为例,您可以选择其他任何选择。 以下是用于安装ShareThis模块的简单步骤。 Step 1 - 单击ShareThis以访问ShareThis模块页面,然后单击Version ,如以下屏幕所示。 Step 2 - 复制模

  • 我是新来的拉威尔,我曾在codeigniter工作。我对雄辩的ORM概念着迷。我有一个关于雄辩能力的一般性问题。ORM的功能是什么,我的意思是我们可以获得相关表行的级别。如果你看“http://four.laravel.com/docs/eloquent#relationships 一对一 一对多 多对多 多态关系 在我看来,“一对一”意味着一级。表1表2

  • 我在使用laravel雄辩的ORM时遇到了一个问题。 基本上,我正在获取与用户相关的帖子,以及他的评论,但是,我正在尝试集成某种分页(我一次只想取5个帖子)。 而使用跳过方法,我总是得到以下laravel错误: 方法skip不存在。 这是我实际使用的代码片段。 有人能给我任何帮助吗? 帐户模型检索与用户相关的帖子模型(关系),但是,我想一次只收到5个帖子,用于基于ajax的请求。

  • 我有以下三个表格: 所以基本上这种关系就像: 用户有许多项目 项目属性到客户端 我的问题是: 如何使用eloquent获得用户的所有客户端? 似乎我不能用户hasManyPass方法,因为在客户端表中没有project_id。 因此,我希望达到的目标是: