通过外键从联结表中检索数据 - Laravel

时间:2017-04-29 14:10:53

标签: mysql laravel

我正在尝试从联结表中获取数据并显示它,因此我有一个用户表和我的联结表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``

2 个答案:

答案 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)

所以这是偶然的。