在 laravel 中显示来自多个表和外键的数据
Posted
技术标签:
【中文标题】在 laravel 中显示来自多个表和外键的数据【英文标题】:display data from multiple tables and foreign keys in laravel 【发布时间】:2019-10-21 03:02:27 【问题描述】:我有两张桌子:
亲爱的
+----+--------------+
| id | name |
+----+--------------+
| 1 | Alec Badwin |
| 2 | Maria Quiban |
+----+--------------+
系列
+----+---------------+
| id | name |
+----+---------------+
| 1 | 30 Rock |
| 2 | Good Day L.A. |
+----+---------------+
我还有一个叫:serie_personnage
+----+-------------+----------+--------------+
| id | bonhomme_id | serie_id | personnage |
+----+-------------+----------+--------------+
| 1 | 1 | 1 | Jack Donaghy |
| 2 | 2 | 2 | Maria Quiban |
+----+-------------+----------+--------------+
我想显示来自 serie_personnage 的人物,并将其与我的刀片中的 bonhomme(在我的表 bonhomme)相关联的名称链接。
换句话说,我想在我的刀片中创建一个表格,其中第 1 列是 bonhomme 的名字,第 2 列是相关的人物。
我该如何处理 Laravel 中的关系?我试过了,但效果不好。
控制器
public function show($id)
$serie = Serie::where('id', $id)->first();
return view('admin.series.castings.show')->withSerie($serie);
型号 - 系列
public function personnages()
return $this->hasMany('App\Models\Admin\SeriePersonnage');
public function acteurs()
return $this->belongsToMany('App\Models\Admin\Bonhomme', 'serie_personnage', 'serie_id', 'bonhomme_id');
刀片
<tbody>
@foreach($serie->acteurs as $acteur)
@foreach($serie->personnages as $personnage)
<tr>
<td> $acteur->nom </td>
<td> $personnage->personnage </td>
<td><a href="#">bla</a></td>
<td> $personnage->rang </td>
<td class="has-text-right">
<a class="button is-outlined" href=" route('series.show', $serie->id) ">
Voir
</a>
<a class="button is-outlined" href="#">Editer</a>
</td>
</tr>
@endforeach
@endforeach
</tbody>
My Table in view
【问题讨论】:
您是否尝试在bonhomme
和serie
表之间使用Many to Many 关系?据我所见,serie_personnage
用作数据透视表,因此您可以像这样设置它并从serie
检索数据
您是否为您的模型 serie_personnage 设置了任何关系?
我已经尝试了多对多关系,但我不确定我是否正确...模型中正确的语法是什么,我如何检索我的数据刀片?
【参考方案1】:
作为法国开发人员,我也必须帮助您!首先,我会更改您的控制器以获得更简单的方式来获得 Serie:
public function show($id)
$serie = Serie::findOrFail($id);
return view('admin.series.castings.show')->withSerie($serie);
编辑:我使用Model::findOrFail($id);
,因为它会抛出Illuminate\Database\Eloquent\ModelNotFoundException
。如果你没有捕捉到异常,Laravel 会自动发送一个 404 HTTP 响应。它可以防止用户使用过时的链接出错。 See the doc for more informations.
那么我认为使用foreach
循环两次不是一个好主意...我宁愿在personnages 上只使用一个foreach
循环。然后,我会从 Personnage 模型中获取角色的演员。它应该类似于下面的代码:
App\Models\Admin\SeriePersonnage.php
<?php
namespace App\Models\Admin;
use App\Models\Admin\Bonhomme;
use Illuminate\Database\Eloquent\Model;
class SeriePersonnage extends Model
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
//Whatever you want to put here
];
/**
* Gets the actor of the character
*/
public function actor()
return $this->belongsTo(Bonhomme::class);
然后在你的刀片视图中:
<tbody>
@foreach($serie->personnages as $personnage)
<tr>
<td>$personnage->actor->nom</td>
<td>$personnage->personnage</td>
<td><a href="#">bla</a></td>
<td>$personnage->rang</td>
<td class="has-text-right"><a class="button is-outlined" href="route('series.show', $serie->id)">Voir</a> <a class="button is-outlined" href="#">Editer</a></td>
</tr>
@endforeach
</tbody>
你也可以在你的actor模型中添加一个personnages()
方法,这样你就可以得到这个actor正在扮演的所有角色。
另外,我建议您使用英文单词来表示变量名、类名以及代码中的每个单词,尤其是当您在英文网站上发帖寻求帮助时。如果您只管理系列,我还建议您将 SeriePersonnage 更改为 only Personnage(您可能还处理电影、日本动漫等,在这种情况下您可以忽略我的消息)。将 serie_personnage 的行名从 personnage
更改为 nom
也很棒。
希望它对你有所帮助,我没有犯错:P
【讨论】:
嗨,Alexandre,非常感谢您的回答和所有提示!我是 Laravel 和开发人员的新手,所以当有人给我提示时总是一件好事!我尝试了您的解决方案,但是当我到达 personnage->actor->nom 时出现“尝试获取非对象的属性 'nom'”错误 :( 那么你在personnage的Model上添加了actor()方法了吗? 是的,我已经把 public function actor() return $this->belongsTo(Bonhomme::class);在我的 SeriePersonnage 模型中,我真的不知道自己做错了什么,这让我发疯了! 试着用dd($personnage)
看看你的$personnage
对象里面有什么,让我们看看你得到了什么。我可能写错了
SeriePersonnage #674 ▼ #table: "serie_personnage" #connection: "mysql" #primaryKey: "id" #keyType: "int" +incrementing: true #with: [] #withCount: [ ] #perPage: 15 +exists: true +wasRecentlyCreated: false #attributes: array:5 [▼ "id" => 1 "bonhomme_id" => 50 "serie_id" => 2 "personnage" => "jok" "rang" => 1 ] #original: array:5 [▶] #changes: [] #casts: [] #observables: [] #relations: [] #guarded: array:1 [▶] 以上是关于在 laravel 中显示来自多个表和外键的数据的主要内容,如果未能解决你的问题,请参考以下文章