在 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

【问题讨论】:

您是否尝试在bonhommeserie 表之间使用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 中显示来自多个表和外键的数据的主要内容,如果未能解决你的问题,请参考以下文章

SQL怎么在有外键的主键表中插数据

JPA:一个带有主键的表和另一个带有主键和外键的表

数据库中主键和外键的作用?

数据库中 主键与外键的区别?

主键和外键的作用

数据库中的表怎样设置外键又怎样才能看出已经是外键了