【问题标题】:got error when show data from other table laravel 5.2显示来自其他表 laravel 5.2 的数据时出错
【发布时间】:2016-08-05 07:14:25
【问题描述】:

我有 2 张桌子。

  1. 用户(姓名、用户名、电子邮件、密码、remember_token)
  2. dosen(iddosen、namedosen、地址、电话号码)

我想在 1 个视图中显示 2 个表中的数据。

我的用户模型:

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

剂量模型:

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

查看:

 @foreach($dosen as $key => $value)                 
 <strong>Kode Dosen :</strong> {{ $value->profildosen->iddosen }}<br>
 <strong>Nama  :</strong> {{ $value->profildosen->namedosen}}<br>
 <strong>Alamat :</strong> {{ $value->profildosen->address}}<br>
<strong>No HP :</strong> {{ $value->phonenumber}} <br>
 <strong>Email :</strong> {{ $value->email }}<br>
 @endforeach

方法:

 $dosen = User::paginate(5);
 return view('admin/dosen.index', compact('dosen'));

并得到错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'dosen.id' in 'where       clause' (SQL: select * from `dosen` where `dosen`.`id` is null limit 1) (View: D:\XAMPP\htdocs\infodosenku\resources\views\admin\dosen\index.blade.php)

什么是正确的方法?

更新

方案数据库

Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('username');
        $table->string('email')->unique();
        $table->string('password', 60);
        $table->boolean('admin')->default(0);
        $table->rememberToken();
        $table->timestamps();
    });

Schema::create('dosen', function (Blueprint $table) {
        $table->string('id');
        $table->string('user_id');
        $table->string('nipy');
        $table->string('namadosen');
        $table->string('alamatdosen');
        $table->integer('notelpdosen');
        $table->timestamps();
    });

路线:

Route::resource('/admin/dosen', 'AdminController',
            ['except' => ['show']]);

控制器:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Request;
use App\Http\Requests;
use App\Http\Requests\CreateDosenRequest;
use App\Dosen;
use App\User;
use Illuminate\Support\Facades\Input;
use DB;

class AdminController extends Controller
{
public function index()
{
     // ambil semua data dosen
    $dosen = User::paginate(5);
    return view('admin/dosen.index', compact('dosen'));

}

public function create()
{
    return view('admin/dosen.create');
}

public function store(CreateDosenRequest $request)
{
    $user = User::create([
        'name' => $request->input('name'),
        'username' => $request->input('username'),
        'email' => $request->input('email'),
        'password' => bcrypt($request->input['password']),
        'admin' => $request->input('admin')
    ]);




      $dosen = Dosen::create([
        'id' => $request->input('iddosen'),
        'nipy' => $request->input('nipy'),
        'namadosen' => $user->name,
        'user_id' => $user->id,
        'alamatdosen' => $request->input('alamatdosen'),
        'notelpdosen' => $request->input('notelpdosen'),
    ]);


    return redirect('admin/dosen')->with('message', 'Data berhasil ditambahkan!');              
}

public function show($id)
{
    $dosen = User::find($id);
    return view('admin/dosen/show', compact('dosen'));
}

public function edit($id)
{
    $dosen = User::find($id);

    return view('admin.dosen.edit', compact('dosen'));
}

public function update($id)
{
    $dosenUpdate = Request::all();
    $dosen = User::find($id);
    $dosen->update($dosenUpdate);
    return redirect('admin.dosen')->with('message', 'Data berhasil diubah!');
}

public function destroy($id)
{       
    User::find($id)->delete();
    return redirect('admin.dosen')->with('message', 'Data berhasil dihapus!');
}   
}

我的看法:

@extends('layouts.app')
@section('content')
<div class="container">
    <div class="row">
       <div class="col-md-10 col-md-offset-1">
        <div class="panel panel-default">
            <div class="panel-heading">Daftar Dosen</div>
                <div class="panel-body">
                <form class ="form-inline" action="{{ URL('/dosen/hasil/') }}" action="GET">
                        <div class="form-group">
                            <label for="cari">Cari Dosen </label>
                            <input type="text" class="form-control" id="cari" name="cari" placeholder="Masukan Nama Dosen">
                        </div>
                            <input class="btn btn-primary" type="submit" value="Cari">

                    </form><br>
                  <table class="table table-striped table-bordered">
                            <thead>
                                <tr>

                                    <td>Nama</td>
                                    <td>username</td>

                                    <td>Actions</td>
                                </tr>
                            </thead>
                        <tbody>
            @foreach($dosen as $key => $value)
                    <tr>

                        <td>{{ $value->name }}</td>
                        <td>{{ $value->username}}</td>


                         <td>
                            {!! Form::open(['url' => 'dosen/' . $value->id . '/edit', 'style'=>'display:inline-block']) !!}
                            {!! Form::hidden('_method', 'GET') !!}
                            {{ Form::button('<i class="fa fa-pencil-square-o"></i>', ['type' => 'submit', 'class' => 'btn btn-warning', 'title' => 'Ubah'] )  }}
                            {!! Form::close() !!}

                          <button title="Tampilkan" type="button" class="btn btn-success" data-toggle="modal" data-target="#myModal-{{ $value->id }}"><i class="fa fa-share"></i></button>

                          <!-- Modal -->
                          <div class="modal fade" id="myModal-{{ $value->id }}" role="dialog">
                            <div class="modal-dialog modal-sm">
                              <div class="modal-content">
                                <div class="modal-header">
                                  <button type="button" class="close" data-dismiss="modal">&times;</button>
                                  <h4 class="modal-title">{{ $value->namadosen }}</h4>
                                </div>
                                <div class="modal-body" style="overflow:auto;">             
                                        <strong>Kode Dosen :</strong> {{ $value->dosen->id }}<br>
                                         <strong>NIP/NIPY :</strong> {{ $value->nipy }}<br>
                                         <strong>Nama  :</strong> {{ $value->namadosen }}<br>
                                         <strong>Alamat :</strong> {{ $value->alamatdosen }}<br>
                                         <strong>No HP :</strong> {{ $value->notelpdosen }} <br>

                                </div>
                                <div class="modal-footer">
                                  <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                                </div>
                              </div>
                            </div>
                          </div>
                            {!! Form::open(['url' => 'dosen/' . $value->id, 'style'=>'display:inline-block']) !!}
                            {!! Form::hidden('_method', 'DELETE') !!}
                            {{ Form::button('<i class="fa fa-trash"></i>', ['type' => 'submit', 'class' => 'btn btn-danger', 'title' => 'Hapus'] )  }}
                            {!! Form::close() !!}
                             {!! Form::model($value, ['route' => ['admin.dosen.update', $value->id], 'method' => 'PUT']) !!}
                        </td>
                    </tr>
            @endforeach
                    </tbody>
                </table>
                 <h5><span class="label label-default">
                Showing {!! $dosen->count() !!} results from total {!! $dosen->total() !!} results.
                </span></h5>
            <div> {!! $dosen->links() !!} </div>
         </div>
      </div>
    </div>
  </div>
</div>
@endsection

剂量模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Dosen extends Model
{
 protected $table = 'dosen';

protected $fillable = ['iddosen', 'namadosen', 'user_id', 'nipy', 'kodeprogdidosen','alamatdosen', 'notelpdosen', 'tempatlahirdosen', 'tanggallahirdosen', 'agamadosen', 'emaildosen', 'sandidosen', 'jkldosen', 'fotodosen'];

protected $casts = [
'iddosen' => 'varchar',
];

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

用户模型:

<?php
 namespace App;
 use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
/**
 * The attributes that are mass assignable.
 *
 * @var array
 */
protected $fillable = [
    'name', 'username', 'email', 'password', 'admin',
];

/**
 * The attributes excluded from the model's JSON form.
 *
 * @var array
 */
protected $hidden = [
    'password', 'remember_token',
];

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

【问题讨论】:

    标签: php laravel-5.2


    【解决方案1】:

    来自Laravel Docs

    Eloquent 通过检查名称来确定默认的外键名称 关系方法的名称,并在方法名称后加上_id。

    你的函数名称是 profiledosen,所以 Laravel 会假设在你的剂量表中你有 id 字段作为主要标识符。

    您只能将其从 iddosen 更改为 id,然后将您的方法名称更改为

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

    或者,您可以为您的方法提供自定义主键,例如

    public function profildosen()
    {
        return $this->belongsTo('App\Dosen', 'iddosen');
    }
    

    【讨论】:

    • 我已将 iddosen 更改为 id。但仍然出现错误尝试获取非对象的属性
    • 如果您应用我拥有的第一个解决方案,那么您应该将函数名称更改为 public function dosen() 并在您的 foreach 循环内将 $value-&gt;profildosen-&gt;iddosen 替换为 $value-&gt;dosen-&gt;id。对于 foreach 中的所有字段
    • 我已经应用了第一个解决方案。我的观点:@foreach($dosen as $key => $value) {{ $value->dosen->id }} @endforeach 我的方法:$dosen = User::paginate(5); return view('admin/dosen.index', compact('dosen'));
    • 能否再次更新您的完整代码和有问题的数据库方案?
    • 我没有要求你更改 Dosen 模型类。我只要求您在用户模型内部进行更改。即更改函数名称并添加外键。
    【解决方案2】:

    原因是您错误地识别了您的表格 ID,因此您应该使用 dosen.iddosen
    而不是 dosen.id 所以查询应该是这样的:select * from dosen where iddosen is null limit 1
    或者您可以使用 Laravel 查询生成器 More
    但最重要的是,您需要知道将在哪些列上加入表格。
    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 2016-05-29
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      相关资源
      最近更新 更多