Laravel: не может показать отношения "многие-ко-многим"

Я не могу показать отношения многих ко многим в поле зрения Это отношения арт-объектов и выставок. У меня много арт-объектов на многих выставках. Но когда я звоню, этого не видно.

В модели:

Выставочная модель:

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');
    }
}

ВыставкаHasArt Model

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> 

Но это не работает.

В таблице Exhibition_has_art_objs Laravel: не может показать отношения &quot;многие-ко-многим&quot;

Я думаю, вам следует использовать belongsToMany, если вы связаны с many to many.

Kapitan Teemo 08.11.2018 05:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
1
1 027
2

Ответы 2

В вашем случае есть нет надобности для определения ВыставкаHasArt. Документация от laravel many to many.

Здесь я пробовал изменять ваши коды напрямую, только для выражения логики «многие ко многим», поэтому вам, возможно, придется отлаживать их и самостоятельно настраивать вашу базу данных.

В моделях:

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>

поверьте мне, мой путь намного проще.

Mou Hsiao 08.11.2018 08:02

вы должны изменить свои отношения таким образом, если вам действительно нравится получать данные из сводной таблицы

please let me know if i am wrong.

Выставочная модель:

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');
    }
}

ВыставкаHasArt Model

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

Marimokung 08.11.2018 06:44

каков результат, когда вы помещаете dd ($ ExhibitionHasArts-> toArray ()) в свой контроллер после красноречивого

Emtiaz Zahid 08.11.2018 06:46

пожалуйста, проверьте текущий сценарий. проблема заключалась в упоминании внешнего ключа и ключа владельца

Emtiaz Zahid 08.11.2018 06:53

когда я использую публичную функцию 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 ()) show uppic.cc/d/7jT Но он не отображается в поле зрения

Marimokung 08.11.2018 06:55

так какой теперь вывод в dd?

Emtiaz Zahid 08.11.2018 07:03

похоже, вы получаете данные с отношениями. так в чем проблема сейчас? есть ли какое-либо исключение?

Emtiaz Zahid 08.11.2018 07:09

также удалите ненужное условие в клинке: @if ($ row-> Exhibition_id == $ Exhibitions-> Ex_id)

Emtiaz Zahid 08.11.2018 07:10

Он говорит: :: Property [Title] не существует в этом экземпляре коллекции. (Просмотр: C: \ xampp \ htdocs \ museum-DB-Project \ resources \ views \ Exhibition‌ \ ShowExhibition.blad‌ e.php)

Marimokung 08.11.2018 07:11

в своем ответе я упомянул, что вы должны добавить ownTo Relationship not hasMany в свою модель ExhibitionHasArt

Emtiaz Zahid 08.11.2018 07:18

Позвольте нам продолжить обсуждение в чате.

Emtiaz Zahid 08.11.2018 07:55

Теперь это работает, но я использую public function Exhibition(){ return $this->hasMany(Exhibition::class,'Ex_id'); } public function Art_obj(){ return $this->belongsTo(Art_obj::class,'art_obj_Id_no'); } в модели ExhibitionHasArt и использую public function ExhibitionHasUser(){ return $this->belongsToMany(ExhibitionHasUser::class,'Ex_id', 'exhibition_id'); } в модели Exhibition, затем последний я использую public function ExhibitionHasArt(){ return $this->hasMany(ExhibitionHasArt::class,'Id_no', 'art_obj_Id_no'); } в модели Art_obj

Marimokung 08.11.2018 18:05

Другие вопросы по теме