如何在 Laravel 中从外键中查看表字段
Posted
技术标签:
【中文标题】如何在 Laravel 中从外键中查看表字段【英文标题】:How to see table fields from foreign keys in Laravel 【发布时间】:2019-08-28 10:04:21 【问题描述】:我是 Laravel 的新手,语法不好。我想通过外键(该表的id)查看另一个表的值。
https://ibb.co/pXRFRHn 你可以在这张图片中看到我在用户和类下获得了 id。我想要与这些 ID 关联的标题。
我有表格部分、用户和课程。我使用class_id
& user_id 作为节表中的外键。当我尝试显示数据时,我看到了 id,但我想要从该 id 中提取的名称和其他字段。
控制器
public function index()
$sections = Section::all();
$classs = Classs::all();
$users = User::all();
return view('sections.index')->with('sections', $sections)->with('classs', $classs)->with('users', $users);
刀片/视图
<div class="box">
<div class="box-header">
<h3 class="box-title">All Sections</h3>
</div>
<div class="box-body">
<table class="table table-responsive">
<thead>
<tr>
<th>Name</th>
<th>Class</th>
<th>User</th>
<th>Modify</th>
</tr>
</thead>
<tbody>
@foreach($sections as $cat)
<tr>
<td>$cat->title</td>
<td>$cat->class_id</td>
<td>$cat->user_id</td>
<td>
<button class="btn btn-info" data-mytitle="$cat->title"
data-myclassid="$cat->class_id" data-myuserid="$cat->user_id"
data-catid=$cat->id data-toggle="modal" data-target="#edit">Edit
</button>
<button class="btn btn-danger" data-catid=$cat->id data-toggle="modal"
data-target="#delete">Delete
</button>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
具体...
<td>$cat->class_id</td>
由此,我得到了类 id,但我也想要它的名字。
$cat->(class_id)->name"
但是,它不起作用。
我已经编辑了模型
class Classs extends Model
//
protected $fillable = [
'id',
'title',
];
public function section()
return $this->belongsTo('App\Section');
截面模型
class Section extends Model
//
protected $fillable = [
'id',
'title',
'class_id',
'user_id',
];
public function classs()
return $this->hasMany('App\Classs');
【问题讨论】:
请分享你的 laravel 代码,你发送这个对象的地方 我已经编辑了我的问题。希望有效。 不,请在控制器或 route.php 文件(后端)中分享您的 laravel 代码 【参考方案1】:完全按照自己的意愿去做是很容易的。 Laravel 擅长创建关系。
您需要将类模型设置为用户模型的关系。见the docs on how to do that
在用户模型中应该接近这个:
public function class()
return $this->belongsTo(\App\Class::class);
然后,当您从控制器中的数据库中拉取用户时,您可以直接包含关系:
$users= \App\User::with('class')->get();
现在,您的集合中有每个用户的相关类模型,您可以在 刀片视图 中直接提取名称:
@foreach($users as $user)
$user->class->name
@endforeach
我建议先用上面这个简单的转储进行测试,因为这样会起作用。然后,您可以尝试在之后附加不同的模型,如类别。
顺便说一句 - 使用 Class 作为类名可能会给您带来问题。建议稍微改变一下。
HTH
【讨论】:
我试过这个,但没有用。在使用之前我必须在模型中创建关系函数吗? 不,我看到您已经发布了控制器,因此您的设置有所不同。让我编辑我的答案以反映: 是的,所有这一切都取决于让 Class 模型成为 User 模型内部的关系。如果您没有先创建关系,则不会工作。这就是我链接到文档的原因 - 这是第一步,创建关系【参考方案2】:你必须声明你的关系。 在您的 User 模型中,
public function class()
return $this->hasOne('App\Class');
和类模型,
public function users()
return $this->hasMany('App\User');
所以之后你可以这样称呼它;
public function index()
$sections = Section::all();
$classs = Classs::with('user')->get();
$users = User::with('class')->get();
return view('sections.index')
->with('sections', $sections)
->with('classs', $classs)
->with('users',$users);
或者你可以像这样在取景时调用它们;
@foreach($users->class()->get() as $class )
$class->name
@endforeach
@foreach($classes->users()->get() as $user )
$user->name
@endforeach
他们称之为“雄辩的关系”Laravel's Relationships
请确保您已阅读它们,因为文档过于清晰,无法在创纪录的时间内理解某些内容。
hasOne 和 hasMany 只是示例。您可以更改哪种关系类型适用。
【讨论】:
【参考方案3】:你要做的就是
data-myclassid="$cat->class_id"
不如试试这个
data-myclassid=" \Illuminate\Support\Facades\DB::table('class')->where('id',$cat->class_id)->value('name')"
我假设您的表名是类,因为您想显示类名,因此在该数据库中的类名(列名)将是简单的 'name' ,这就是为什么我将 name 放在 value 字段中......
【讨论】:
以上是关于如何在 Laravel 中从外键中查看表字段的主要内容,如果未能解决你的问题,请参考以下文章
在 Django 中从外键设置会话变量:需要字段名而不是主键