我正在尝试从联结表中获取数据并显示它,因此我有一个用户表和我的联结表prescription_user。 Prescription_user表有一个user_id和prescription_id。
所以我要做的就是在这个用户详细信息页面上,显示所有这些用户处方并访问处方名称和描述等,但是当我尝试任何这个时,我得到“试图获得非对象的属性“
模型设置为正确加载我认为,用户模型与prescription_user模型具有hasMany关系,而prescription_user模型具有belongsTo用户模型。
控制器
function viewUserDetails($userId)
{
$logged_user_id = Auth::user()->id;
$user = User::find($logged_user_id);
$prescriptions = Auth::user()->prescription_user;
$fullname = $user->firstname ." ". $user->surname;
$email = $user->email;
$address = $user->address;
$postcode = $user->postcode;
$dob = $user->dateofbirth;
$uniquepatientnumber = $user->uniquepatientnumber;
$data = [];
$data['fullname'] = $fullname;
$data['email'] = $email;
$data['address'] = $address;
$data['postcode'] = $postcode;
$data['dateofbirth'] = $dob;
$data['uniquenumber'] = $uniquepatientnumber;
$data['prescriptions'] = $prescriptions;
return view('user/userdetails')->withData($data);`
userdetails blade
@extends('layouts.master')
@section('title', 'My Details')
@section('content')
<h1>My Details </h1>
<ul>
<li>Name: {{ $data['fullname'] }}</li>
<li>Email: {{ $data['email'] }}</li>
<li>Address: {{ $data['address'] }}</li>
<li>Postcode: {{ $data['postcode'] }}</li>
<li>Date of Birth: {{ $data['dateofbirth'] }}</li>
<li>Your Unique number is: {{ $data['uniquenumber'] }}</li>
<li>Your are currently prescribed {{$data['prescriptions']}}</li>
<p>Note: If you believe any of these are incorrect please contact a receptionist</p>
</ul>
@endsection``
答案 0 :(得分:1)
您所解释的内容存在一些设计缺陷。您有用户模型和处方模型。这意味着prescription_user
是您的 pivot 表(不是联结表)。如果到目前为止,我是正确的,这意味着用户和处方有多对多的关系。为了证明我的观点,你说
Prescription_user表有user_id和prescription_id。
这意味着prescription_user是数据透视表。
在您的用户模型中,定义与处方的多对多关系。反之亦然。
用户模型
public function prescriptions() {
return $this->belongsToMany(Prescription::class, 'prescription_user', 'user_id', 'prescription_id');
}
然后你可以改变你的控制器功能
public function viewUserDetails()
{
$user = Auth::user();
$prescriptions = $user->prescriptions;
return view('user/userdetails', compact('user', 'prescriptions'));
}
和你的观点
@extends('layouts.master')
@section('title', 'My Details')
@section('content')
<h1>My Details </h1>
<ul>
<li>Name: {{ $user->firstname }} {{ $user->surname }}</li>
<li>Email: {{ $user->email }}</li>
<li>Address: {{ $user->address }}</li>
<li>Postcode: {{ $user->postcode }}</li>
<li>Date of Birth: {{ $user->dateofbirth }}</li>
<li>Your Unique number is: {{ $user->uniquepatientnumber }}</li>
</ul>
Your are currently prescribed
<ul>
@foreach($prescriptions as $prescription)
<li>{{ $prescription->name }}
@endforeach
</ul>
<p>Note: If you believe any of these are incorrect please contact a receptionist</p>
@endsection
您的代码更整洁,效果更好
<强>更新强>
从数据透视表中获取数据相对简单。在关系中定义这些列
public function prescriptions() {
return $this->belongsToMany(Prescription::class, 'prescription_user', 'user_id', 'prescription_id')->withPivot('column1', 'column2');
}
在您看来,您可以像这样显示
{{ $prescription->pivot->column1 }} {{ $prescription->pivot->column2 }}
答案 1 :(得分:0)
首先我不确定withData()是什么东西。只需 - &gt; with($ data)。
其次,在你的功能开始时会有一些混乱。你传入一个你从未使用过的$ userId。然后从Auth :: user()获取id,然后获取具有该id的用户,您已经拥有该ID。所以只需$ user = Auth :: user();
第三,您只会尝试使用 - &gt;非对象上的运算符,您只能在$ user-&gt;上使用它和Auth :: user() - &gt;
由于您首先从Auth :: user获得了用户,我猜它在Auth :: user() - &gt; id开箱即用,并且没有Auth :: user,但您必须发布更多数据,无论是从浏览器中的错误还是从storage / logs / laravel.log发布。
但是,如果我使用此代码
Route::get('/', function () {
$user = \Auth::user();
die($user->name);
return view('welcome');
}
那里显然没有Auth :: user()(我还没有登录)我得到了这个输出:
ErrorException in web.php line 16:
Trying to get property of non-object
1. in web.php line 16
2. at HandleExceptions-> ... array('user'=>null)
所以这是偶然的。