Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.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 4个表之间的关系Laravel 5.1_Php_Mysql_Eloquent_Laravel 5.1_Relationship - Fatal编程技术网

Php 4个表之间的关系Laravel 5.1

Php 4个表之间的关系Laravel 5.1,php,mysql,eloquent,laravel-5.1,relationship,Php,Mysql,Eloquent,Laravel 5.1,Relationship,我需要显示饲料与总评论,总喜欢在该饲料与用户谁评论的细节 提要表 | id | movie_id | user_id | description | |----|----------|----------|-------------| | 1 | 1 | 1 | Lorem Ipsum | | id | feed_id | user_id | comment | |----|-------- |----------|-----------| | 1

我需要显示饲料与总评论,总喜欢在该饲料与用户谁评论的细节

提要表

| id | movie_id | user_id  | description | 
|----|----------|----------|-------------|
| 1  | 1        | 1        | Lorem Ipsum |
| id | feed_id | user_id  | comment   | 
|----|-------- |----------|-----------|
| 1  | 1       | 2        | comment 1 |
| 2  | 1       | 3        | comment 2 |
| id | feed_id | user_id  |
|----|-------- |----------|
| 1  | 1       | 2        |
| 2  | 1       | 3        |
| id | username| email  |
|----|-------- |--------|
| 1  | a       | a@a.com|
| 2  | b       | b@b.com|
| 3  | c       | c@c.com|
评论表

| id | movie_id | user_id  | description | 
|----|----------|----------|-------------|
| 1  | 1        | 1        | Lorem Ipsum |
| id | feed_id | user_id  | comment   | 
|----|-------- |----------|-----------|
| 1  | 1       | 2        | comment 1 |
| 2  | 1       | 3        | comment 2 |
| id | feed_id | user_id  |
|----|-------- |----------|
| 1  | 1       | 2        |
| 2  | 1       | 3        |
| id | username| email  |
|----|-------- |--------|
| 1  | a       | a@a.com|
| 2  | b       | b@b.com|
| 3  | c       | c@c.com|
喜欢表格

| id | movie_id | user_id  | description | 
|----|----------|----------|-------------|
| 1  | 1        | 1        | Lorem Ipsum |
| id | feed_id | user_id  | comment   | 
|----|-------- |----------|-----------|
| 1  | 1       | 2        | comment 1 |
| 2  | 1       | 3        | comment 2 |
| id | feed_id | user_id  |
|----|-------- |----------|
| 1  | 1       | 2        |
| 2  | 1       | 3        |
| id | username| email  |
|----|-------- |--------|
| 1  | a       | a@a.com|
| 2  | b       | b@b.com|
| 3  | c       | c@c.com|
用户表

| id | movie_id | user_id  | description | 
|----|----------|----------|-------------|
| 1  | 1        | 1        | Lorem Ipsum |
| id | feed_id | user_id  | comment   | 
|----|-------- |----------|-----------|
| 1  | 1       | 2        | comment 1 |
| 2  | 1       | 3        | comment 2 |
| id | feed_id | user_id  |
|----|-------- |----------|
| 1  | 1       | 2        |
| 2  | 1       | 3        |
| id | username| email  |
|----|-------- |--------|
| 1  | a       | a@a.com|
| 2  | b       | b@b.com|
| 3  | c       | c@c.com|
关系

Feed.php

public function user () {
    return $this->belongsTo('App\User');
}

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

public function comments () {
    return $this->hasMany('App\Comment');
}
public function feeds () {
    return $this->belongsToMany('App\Feed');
}

public function like () {
    return $this->belongsTo('App\Like');
}

public function comment () {
    return $this->belongsTo('App\Comment');
}
public function user () {
    return $this->belongsTo('App\User');
}

public function feed () {
    return $this->belongsTo('App\Feed');
}
public function user () {
    return $this->belongsTo('App\User');
}

public function feed () {
    return $this->belongsTo('App\Feed');
}
User.php

public function user () {
    return $this->belongsTo('App\User');
}

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

public function comments () {
    return $this->hasMany('App\Comment');
}
public function feeds () {
    return $this->belongsToMany('App\Feed');
}

public function like () {
    return $this->belongsTo('App\Like');
}

public function comment () {
    return $this->belongsTo('App\Comment');
}
public function user () {
    return $this->belongsTo('App\User');
}

public function feed () {
    return $this->belongsTo('App\Feed');
}
public function user () {
    return $this->belongsTo('App\User');
}

public function feed () {
    return $this->belongsTo('App\Feed');
}
Like.php

public function user () {
    return $this->belongsTo('App\User');
}

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

public function comments () {
    return $this->hasMany('App\Comment');
}
public function feeds () {
    return $this->belongsToMany('App\Feed');
}

public function like () {
    return $this->belongsTo('App\Like');
}

public function comment () {
    return $this->belongsTo('App\Comment');
}
public function user () {
    return $this->belongsTo('App\User');
}

public function feed () {
    return $this->belongsTo('App\Feed');
}
public function user () {
    return $this->belongsTo('App\User');
}

public function feed () {
    return $this->belongsTo('App\Feed');
}
Comment.php

public function user () {
    return $this->belongsTo('App\User');
}

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

public function comments () {
    return $this->hasMany('App\Comment');
}
public function feeds () {
    return $this->belongsToMany('App\Feed');
}

public function like () {
    return $this->belongsTo('App\Like');
}

public function comment () {
    return $this->belongsTo('App\Comment');
}
public function user () {
    return $this->belongsTo('App\User');
}

public function feed () {
    return $this->belongsTo('App\Feed');
}
public function user () {
    return $this->belongsTo('App\User');
}

public function feed () {
    return $this->belongsTo('App\Feed');
}
现在我需要获取所有提要(我已经完成了),包括评论数、喜欢数和评论过的用户详细信息。

我怎样才能用雄辩的语言在单个查询中得到它。

试试这个

$commentsCount = \App\Models\Comment::select('feed_id',\DB::raw('count(id) as comments_count'))->groupBy('feed_id')->toSql();
    $likesCount = \App\Models\Like::select('feed_id',\DB::raw('count(id) as likes_count'))->groupBy('feed_id')->toSql();
    $records = \DB::table('feeds as f')
            ->leftJoin('comments as c','f.id','=','c.feed_id')
            ->leftJoin('users as u','c.user_id','=','u.id')
            ->leftJoin(\DB::raw('('.$commentsCount.') as k'),'f.id','=','k.feed_id')
            ->leftJoin(\DB::raw('('.$likesCount.') as l'),'f.id','=','l.feed_id')
            ->select('f.id as fid','f.description','u.id as uid','u.name','u.email','k.comments_count','l.likes_count')
            ->orderBy('fid')
            ->get();

    $transform = function(array $records){
        $records = collect($records)->groupBy('fid');
        return $records->transform(function($items){
            $feed['id'] = $items->first()->fid;
            $feed['description'] = $items->first()->description;
            $feed['count'] = [
                'likes' => is_null($items->first()->likes_count) ? 0 : $items->first()->likes_count,
                'comments' => is_null($items->first()->comments_count) ? 0 : $items->first()->comments_count,
            ];
            $feed['users'] = $items->transform(function($user){
                return is_null($user->uid) ? [] : ['id'=>$user->uid,'name'=>$user->name,'email'=>$user->email];
            });

            return $feed;
        });
    };

    return array_values($transform($records)->toArray());
您可以将闭包函数与其他函数交换。像

$this->transform($records);

您可以通过定义的函数简单地访问所有这些属性

例如:

$feed = Feed::find($id);

foreach($feed->likes() as $like){
    echo $like->user()->get('username');
}

等等。当您调用->get()时,您正在访问一个对象,该对象可以遍历所有这些对象。

您不能使用eloquent在单个查询中实现这一点。。但是你可以在4个查询中完成。我正在为移动API工作,如果我使用4个查询,速度会太慢。这可能比使用连接的1个长查询快。。如果您想使用连接,您可以很容易地对其进行测试。请参见:能否显示用于获取计数的控制器代码。