我是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
没有错误,但城市没有返回任何值 结果表明城市没有设置。
答案 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>