laravel控制器中使用eloquent的问题

User.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
     protected $table = 'user';
     protected $primaryKey = 'id';
     public $timestamps = false;
     public function comments(){ 
         return $this->hasOne('App\Models\Comment', 'uid', 'uid');
     }
}

Comment.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
     protected $table = 'comment';
     protected $primaryKey = 'id';
     public $timestamps = false;
     public function comments(){ 
         return $this->hasMany('App\Models\User', 'uid', 'uid');
     }
}

我想在Test控制器中使用User模型中comments方法的数据 应该怎么使用呢?

use App\Models\User;
class TestController extends Controller{
     public function test(){
       
  }
}
阅读 2.5k
2 个回答

这是典型的一对多模型关联: Eloquent 关联:一对多

从你的源码来看,你的映射关系是错的,一个用户肯定会发表多个评论,所以在 User model 中应该是用 hasMany,

class User extends Model
{
     public function comments(){ 
         return $this->hasMany('App\Models\Comment', 'uid', 'uid');
     }
}

而对于 Comment 模型,每个评论只属于一个用户

class Comment extends Model
{
     public function user(){ 
         return $this->belongsTo('App\Models\User', 'uid', 'uid');
     }
}

拿到用户的所有评论写法如下:

class TestController extends Controller{
     public function test(){
       $user= User::find($id);
       $comments= $user->comments; //拿到该用户的所有评论
  }
}

如果你拿到了一条评论数据,要获取到该评论的用户模型,应该是

class TestController extends Controller{
     public function test(){
       $comment= Comment::find($id);
       $user= $comment->user; //拿到该评论的所属用户
  }
}

其实在官方文档中已经说的比较清楚了,请认真仔细阅读文档。

1.Laravel中的hasOne是一对一的关系, 如果一个用户只能评论一条,可以这么使用。
2.先将用户查出来,然后再调用User Models中的comments方法,示例如下:

public function test(){
User::find($id)->comments;
}

如果是一个用户可以评论多条则需要使用hasMany或belongsTo
具体使用方法可以参考laravel china手册关联关系章节:
https://d.laravel-china.org/d...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题