【问题标题】:I am trying to get the columns from an array but can be able to get it in laravel我正在尝试从数组中获取列,但可以在 laravel 中获取
【发布时间】:2023-03-26 19:05:01
【问题描述】:

我正在尝试通过 id 从另一个表中获取列,但每当我在视图中使用 foreach 时都会收到此错误

此集合实例上不存在属性 [id]。 (查看:C:\xampp\htdocs\myUniMentor\resources\views\userProfile\viewUserProfilePage.blade.php)

但是,如果我在没有 foreach 类似 $users->reviews 的命令的情况下运行代码,我会得到 review 表的数组以及与该特定 ID 相关的所有内容,并且这样做 $users->reviews->comments 会给我一个错误

此集合实例上不存在属性 [cmets]。 (查看:C:\xampp\htdocs\myUniMentor\resources\views\userProfile\viewUserProfilePage.blade.php)

我的问题是:

  1. 如何使用模型显示 cmets?
  2. $users->reviews 如何只返回与 id 关联的列?是不是因为我在belongsTo()中传递了id?

ReviewController.php

public function showUserProfile($id) {

        $users = User::find($id);

        // echo $users->first_name;

        return view('userProfile.viewUserProfilePage', compact('users'));
    }
}

 public function addNewReview($id) {

        $stars = Input::get("rating");
        $message = Input::get("message");

        // $users = User::find($id);

        $users = User::where('id', $id)->first();
        // echo $stars;
        // echo $message;
        // echo $users;
        // echo $users->id;
        // echo Auth::user()->id;
        // die();
        $reviews = new Review();
        $reviews->user_id = $users->id;
        $reviews->given_by = Auth::user()->first_name . ' ' . Auth::user()->last_name;
        $reviews->stars = $stars;
        $reviews->comments = $message;

        $reviews->save();

        Session::flash('message','Your Review has been added to the Mentor');
        return redirect('show-user-profile/' . $users->id);
    }

show-user-profile.blade.php

@section('content2')

<h3>Reviews</h3>
<p>{{ $users->reviews->comments }}</p> 

@endsection

Review.php

namespace App;

use Illuminate\Database\Eloquent\Model;
use App\User;

class Review extends Model
{
    protected $fillable = [
        'comments', 'stars', 'given_by',
    ];

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

User.php

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

use App\UserType;
use App\Subject;
use App\SubjectKeyword;
use App\Review;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'first_name', 'last_name', 'type', 'username', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function getAllUsers() {
        return User::all();
     }

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

    // public function subjects()
    // {
    //     return $this->belongsToMany('App\Subject');
    // }

    public function subjects(){
        return $this->belongsTo('App\Subject','subject_id','id');
    }

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

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

【问题讨论】:

    标签: laravel model-view-controller eloquent eloquent-relationship


    【解决方案1】:

    请更改以下内容:

    1. 在您的 HTML 中

      @foreach($users->reviews as $review)
       <p>{{ $review->comments }}</p> 
      @endforeach
      
    2. 在你的Review.php中,由于评论属于用户,更改为

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

    【讨论】:

    • 您好 Bundayy Olayinka,感谢您的回答。这对我有用。我理解这一点,但你介意解释一下,以便我知道我的理解是正确的吗?
    • 太棒了。根据你的映射,一个用户有很多评论,所以当你想得到一个用户的评论时,你会得到一个集合,然后要显示它们中的每一个,你需要遍历集合,这样你就可以在每次审查。对于第二个,由于评论属于用户,所以你不需要给它一个复数函数名称,你也不需要手动映射它,因为你已经有一个user_id 字段。Laravel 自动选择模型名称与_ 连接,然后是主键,即user_id,其中User 是模型,id 是主键。
    • 谢谢。我明白了。如果您能回答,我还有一个与此相关的问题。如果我必须从 3 个不同的表中获取结果呢?例如在这种情况下,$users-&gt;review-&gt;coments 正在寻找我 cmets 那么如果我在 $users 之前再添加一个模型呢?这行得通吗?
    • 我怎样才能把最新的记录放在最上面呢?我试过 orderBy 但不工作
    • 将最新的放在顶部添加orderBy('created_at','desc')。我不太明白你问的关于从另一个表中获取数据的另一个问题。也许你应该更详细一些
    【解决方案2】:

    不清楚您要在刀片文件中做什么。但是如果你想打印用户所有评论的所有cmets。

    显示用户个人资料刀片

    @section('content2')
    
        <h3>Reviews</h3>
        @foreach($user->reviews as $review)
            <p>{{ $review->comments }}</p>
        @endforeach 
    
    @endsection
    

    说明

    reviews()user 的一对多关系,$user-&gt;reviews 是一个集合。因此,如果您想访问 review 的任何属性,您需要遍历该集合。

    【讨论】:

    • 已经解决了,谢谢您的回答。你能告诉我如何在最上面按最新订购吗?我试过 orderBy 但不工作
    猜你喜欢
    • 2022-10-13
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多