Laravel:无法在视图中显示多对多关系

Posted

技术标签:

【中文标题】Laravel:无法在视图中显示多对多关系【英文标题】:Laravel : Cannot show many to many relationships in view 【发布时间】:2019-04-11 14:21:42 【问题描述】:

我无法在视图中显示多对多关系 这是艺术品和展览的关系。 我在许多展览桌上有许多艺术品。 但是当我打电话时它不会显示在视图中。

在模型中:

展览模式:

class Exhibition extends Model

    protected $table = 'exhibitions';
    protected $fillable = ['Ex_id','Name','Start_date','End_date','Limit_visit','picture'];
    protected $primaryKey = 'Ex_id';

    public function ExhibitionHasUser()
        return $this->belongsTo(ExhibitionHasUser::class,'Ex_id', 'exhibition_id');
    

ExhibitionHasArt 模型

class ExhibitionHasArt extends Model

    protected $table = 'exhibition_has_art_objs';
    protected $fillable = ['list_no','exhibition_id','art_obj_Id_no'];
    protected $primaryKey = 'list_no';

    public function Exhibition()
        return $this->hasMany(Exhibition::class,'exhibition_id');
    

    public function Art_obj()
        return $this->hasMany(Art_obj::class,'Id_no');
    

Art_obj 模型

class Art_obj extends Model

    protected $table = 'art_objs';
    protected $fillable = ['Id_no','Type_of_art','Type_of_coll','Picture'];
    protected $primaryKey = 'Id_no';


    public function ExhibitionHasArt()
        return $this->belongsTo(ExhibitionHasArt::class,'Id_no', 'art_obj_Id_no');
    



在 ExhibitionController 中

 public function show($Ex_id)
    
        $exhibitions = Exhibition::find($Ex_id);
        $exhibitionHasArts = ExhibitionHasArt::with('Art_obj')->get();
        return view('Exhibition.ShowExhibition', compact('exhibitions','exhibitionHasArts')); 
    

在视图中:我想展示从主键中找到的展览,并展示在本次展览中展示的艺术品。

<h1>Exhibition: $exhibitions->Ex_id</h1>
            <h2>Art objects in this exhibition</h2>
            <br>
            <table class="table table-bordered table-striped"> 
                <tr>
                    <td>exhibition_id</td>
                    <td>art_obj_Id_no</td>
                    <td>Title</td>
                </tr>
                @foreach($exhibitionHasArts as $row) 
                @if($row->exhibition_id == $exhibitions->Ex_id)
                    <tr>
                        <td>$row->exhibition_id</td>
                        <td>$row->art_obj_Id_no</td>
                        <td>$row->Art_obj->Title</td>
                    </tr>
                @endif
                @endforeach 
            </table> 

但它不起作用。

在表中展览_has_art_objs

【问题讨论】:

如果你的关系是many to many,我认为你应该使用belongsToMany 【参考方案1】:

在您的情况下,不需要定义 ExhibitionHasArt。 From laravel many to many documentation.

我这里尝试的是直接修改你的代码,只是为了表达多对多的逻辑,所以你可能需要自己调试和适配你的数据库。

在模型中

class Exhibition extends Model

    protected $table = 'exhibitions';
    //While the primary key of a table is set auto increasing, it doesn't need to be fillable.
    protected $fillable = [/*'Ex_id'*/,'Name','Start_date','End_date','Limit_visit','picture'];
    protected $primaryKey = 'Ex_id';

    public function art_objs() 
        //use "belongsToMany" instead of "belongsTo".
        return $this->belongsToMany(Art_obj::class, 'exhibition_has_art_objs', 'exhibition_id', 'art_obj_id_no');
    


class Art_obj extends Model

    protected $table = 'art_objs';
    //The primary key of a table is usually set auto increasing, no need to be fillable.
    protected $fillable = [/*Id_no, */'Type_of_art','Type_of_coll','Picture']; 
    protected $primaryKey = 'Id_no';

    public function exhibitions() 
        return $this->belongsToMany(Exhibition::class,'exhibition_has_art_objs', 'art_obj_id_no', 'exhibition_id');
    

在 ExhibitionController 中

public function show($Ex_id)

    $exhibition = Exhibition::find($Ex_id);
    return view('Exhibition.ShowExhibition', compact('exhibition')); 

在视图中

<h1>Exhibition: $exhibition->Ex_id</h1>
<h2>Art objects in this exhibition</h2>
<br>
<table class="table table-bordered table-striped"> 
    <tr>
        <td>exhibition_id</td>
        <td>art_obj_Id_no</td>
        <td>Title</td>
    </tr>
    @foreach($exhibition->art_objs as $art_obj) 
        <tr>
            <td>$exhibition->Ex_id</td>
            <td>$art_obj->Id_no</td>
            <td>$art_obj->Type_of_art</td>
        </tr>
    @endforeach 
</table>

【讨论】:

相信我,我的方法要容易得多。【参考方案2】:

如果你真的想从数据透视表中获取数据,你应该像这样改变你的关系

如果我错了,请告诉我。

展览模式:

class Exhibition extends Model

    protected $table = 'exhibitions';
    protected $fillable = ['Ex_id','Name','Start_date','End_date','Limit_visit','picture'];
    protected $primaryKey = 'Ex_id';

    public function ExhibitionHasUser()
        return $this->hasMany(ExhibitionHasUser::class,'exhibition_id','Ex_id');
    

ExhibitionHasArt 模型

class ExhibitionHasArt extends Model

    protected $table = 'exhibition_has_art_objs';
    protected $fillable = ['list_no','exhibition_id','art_obj_Id_no'];
    protected $primaryKey = 'list_no';

    public function Exhibition()
        return $this->belongsTo(Exhibition::class,'exhibition_id', 'Ex_id');
    

    public function Art_obj()
        return $this->belongsTo(Art_obj::class,'art_obj_Id_no', 'Id_no');
    

Art_obj 模型

class Art_obj extends Model

    protected $table = 'art_objs';
    protected $fillable = ['Id_no','Type_of_art','Type_of_coll','Picture'];
    protected $primaryKey = 'Id_no';


    public function ExhibitionHasArt()
        return $this->hasMany(ExhibitionHasArt::class,'art_obj_Id_no','Id_no');
    

【讨论】:

上面写着Trying to get property 'Title' of non-object 在 eloquent 之后将 dd($exhibitionHasArts->toArray()) 放入控制器时的输出是什么 请检查当前脚本。问题在于外键和所有者键提及 当我使用公共函数 Exhibition() return $this->hasMany(Exhibition::class,'exhibition_id', 'Ex_id'); 公共函数 Art_obj() return $this->hasMany(Art_obj::class,'art_obj_Id_no', 'Id_no'); dd($exhibitionHasArts->toArray()) 显示uppic.cc/d/7jT 但它没有显示在视图中 那么现在 dd 的输出是什么?

以上是关于Laravel:无法在视图中显示多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel eloquent 检查不存在的多对多关系

Laravel:无法添加记录多对多关系

在 Laravel 中查询用户的多对多关系

在 Laravel 中返​​回多对多关系的统一 JSON

laravel 使用具有多对多关系数据透视表的策略

在 Laravel 中填充具有多对多关系的表