未定义的属性:stdClass :: $ ****在一对多关系中Laravel 5

时间:2015-10-01 03:35:03

标签: laravel-5

我是Laravel的新手,我正在创建一个Laravel5项目,其中Voters与一个城市的一对多关系相关:每个选民只有一个城市,而城市有很多选民

我的表看起来像这样

//选民

Id Name City_id

//城市

Id Name 

在App / Models中

// city.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class City extends Model
{
/**
*The table associated with the model
*
*/
protected $table = 'city';

/**
* indicates if the model should be timestamped
* @var bool
*/

public $timestamps = false;

 public function voters()
 {
    return $this->belongsTo('App\models\Voters');
 }
}

voters.php

 <?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Voters extends Model
{
 protected $table = 'voters';

 public function city()
 {
    return $this->hasMany('App\Models\City');
 }
}

我可以通过这种方式访问​​控制器中的所有选民

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use DB;

class VotersController extends Controller
{
/**
 * Display a listing of the resource.
 *
 * @return \Illuminate\Http\Response
 */
  public function index()
  {
     $voters = DB::table('voters')->get();
     return view('voters.all_voters',['voters' => $voters] );
  }
 }

但问题是选民的城市返回错误

Undefined property: stdClass::$city (View: .....

刀片模板

<div class="table-responsive">
<table class="table table-hover table-bordered table-condensed">
    <thead>
        <tr>
            <th>Name</th>
            <th>Age</th>
            <th>Profession</th>
            <th>City</th>
            <th>Province</th>
            <th>Region</th>
            <th>Island</th>
        </tr>
    </thead>
    <tbody>
        @foreach($voters as $voter)
        <tr>
            <td>{{ $voter->firstname }}</td>
            <td>{{ $voter->birthday }}</td>
            <td>{{ $voter->profession_id }}</td>
            <td>{{ $voters->city_id }} </td>//returnm the city_id but I want the city name in this case
            <td>{{ $voter->city->name }}</td>//
            <td></td>
            <td></td>
            <td></td>
        </tr>
        @endforeach
    </tbody>
</table>

如何在Laravel中正确显示此类关系的相关字段?

更新

检查财产

 @if(isset($voter->city))
    {{ $voter->city->name }}
  @endif

没有错误,但城市没有返回任何值 结果表明城市没有设置。

3 个答案:

答案 0 :(得分:3)

检查选民是否有相关城市,否则刀片会投诉。我们可以用详细的PHP代码表达这一点:

{{ isset($voter->city) ? $voter->city : 'Default' }}

然而,Blade并没有编写三元语句,而是为您提供以下方便的捷径:

{{ $votert->name or 'Default' }}

答案 1 :(得分:0)

你应该扭转关系。一个城市有很多选民。选民属于一个城市。

在城市模型中

 public function voters()
 {
    return $this->hasMany('App\models\Voters');
 }

选民模特

 public function city()
 {
    return $this->belongsTo('App\models\City');
 }

在您的控制器中,请不要使用查询构建器,而是使用模型进行查询。

  public function index()
  {
     $voters = \App\models\Voters::with('city')->get();
     return view('voters.all_voters',['voters' => $voters] );
  }

答案 2 :(得分:0)

使用用户@Mwaa Joseph提供的代码,我可以显示所有选民,只有选民与城市相关联。但如果选民与城市无关,该怎么办?示例选民的city_id为空或为空,Blade会抱怨

"Trying to get property of non-object (View:......"

所以解决方案是在Blade模板中添加... if .. else条件

  <td>{{$voter->city->name}}</td>//works if all voters linked to city

  //the solution
  <td>
    @if(empty($voter->city->name))
        {{$voter->city}}
    @else
        {{$voter->city->name}}
    @endif
    </td>