За последние 24 часа нас посетил 17941 программист и 1582 робота. Сейчас ищут 1352 программиста ...

Как правильно выбрать отношение

Тема в разделе "Laravel", создана пользователем Feonix89, 16 авг 2018.

Метки:
  1. Feonix89

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    Здравствуйте!. Есть следующие таблицы:
    Equipments (id, name, publisher_id, technical_attribute_id)
    Publishers (id, name)
    Technical_attributes(id, name)
    Я попробовал сделать сначала связь между двумя таблицами (Equipments и Publishers) как один ко многим (1 оборудование может иметь 1 производителя, а 1 производитель может делать много оборудования). И все вроде бы получилось.
    Выкладываю без git так уж исторически сложилось...
    PHP:
    1. <?php
    2. namespace App;
    3. use Illuminate\Database\Eloquent\Model;
    4. class Equipment extends Model
    5. {
    6.     protected $fillable = ['name', 'publisher_id'];
    7.     protected $table = 'equipments';
    8.     public function publisher()
    9.     {
    10.         return $this->belongsTo('App\Publisher', 'publisher_id', 'id');
    11.     }
    12. }
    PHP:
    1. @extends('layouts.app')
    2. @section('content')
    3.     <div class="container">
    4.         <a href="{{ route('equipment.create') }}" class="btn btn-primary">Создать</a>
    5.         <hr>
    6.         <table class="footable table table-stripped toggle-arrow-tiny">
    7.             <thead>
    8.                 <tr>
    9.                     <th data.toggle="true">Заголовок</th>
    10.                     <th data.toggle="true">Производитель</th>
    11.                 </tr>
    12.             </thead>
    13.             <tbody>
    14.                 @forelse($equipments as $equipment)
    15.                     <tr>
    16.                         <td>{{ $equipment->name }}</td>
    17.                         <td>{{ $equipment->publisher->name }}</td>
    18.                         <td class="text-right">
    19.                             <form onsubmit="if(confirm('Удалить?')){return true}else{return false}" action="{{ route('equipment.destroy', $equipment) }}" method="post">
    20.                                 <input type="hidden" name="_method" value="DELETE">
    21.                                 {{ csrf_field() }}
    22.                                 <div class="btn-group">
    23.                                     <a class="btn btn-secondary" href="{{ route('equipment.show', $equipment) }}">Просмотр</a>
    24.                                     <a class="btn btn-primary" href="{{ route('equipment.edit', $equipment) }}">Редактировать</a>
    25.                                     <button class="btn btn-danger" type="submit">Удалить</button>
    26.                                 </div>
    27.                             </form>
    28.                         </td>
    29.                     </tr>
    30.                 @empty
    31.                 <p>Оборудование отсутствует</p>
    32.                 @endforelse
    33.             </tbody>
    34.         </table>
    35.     </div>
    36. @endsection
    PHP:
    1. @extends('layouts.app')
    2. @section('content')
    3.     <div class="container">
    4.         <form class="form-horizontal" action="{{ route('equipment.store') }}" method="post">
    5.             {{ csrf_field() }}
    6.                 <fieldset class="form-horizontal">
    7.                     <div class="form-group">
    8.                         <label class="col-sm-2 control-label">Наименование:</label>
    9.                         <div class="col-sm-10">
    10.                             <input type="text" name="name" class="form-control" placeholder="" value="{{ $equipment->name or '' }}">
    11.                         </div>
    12.                         <label class="col-sm-2 comtrol-label">Производитель:</label>
    13.                         <div class="col-sm-10">
    14.                             <input type="text" name="publisher_id" class="form-control" placeholder="" value="{{ $equipment->publisher->name or '' }}">
    15.                         </div>
    16.                     </div>
    17.                     <div class="form-group">
    18.                         <div class="col-sm-4 sol-sm-offset-2">
    19.                             <button class="btn btn-primary" type="submit">Сохранить</button>
    20.                         </div>
    21.                     </div>
    22.                 </fieldset>
    23.         </form>
    24.     </div>
    25. @endsection
    PHP:
    1. @extends('layouts.app')
    2.  
    3. @section('content')
    4.     <div class="container">
    5.         <h3>Оборудование производителя: {{ $equipment->publisher->name or '' }}</h3>
    6.         <form class="form-horizontal" action="{{ route('equipment.update', $equipment) }}" method="post">
    7.             {{ method_field('PUT') }}
    8.             {{ csrf_field() }}
    9.             <fieldset class="form-horizontal">
    10.                 <div class="form-group">
    11.                     <label class="col-sm-2 control-label">Наименование:</label>
    12.                     <div class="col-sm-10">
    13.                         <textarea name="name" class="form-control">{{ $equipment->name or '' }}</textarea>
    14.                     </div>
    15.                 </div>
    16.                 <div class="form-group">
    17.                     <div class="col-sm-4 col-sm-offset-2">
    18.                         <button class="btn btn-primary" type="submit">Сохранить</button>
    19.                     </div>
    20.                 </div>
    21.             </fieldset>
    22.         </form>
    23.     </div>
    24. @endsection
    PHP:
    1. <?php
    2.  
    3. use Illuminate\Support\Facades\Schema;
    4. use Illuminate\Database\Schema\Blueprint;
    5. use Illuminate\Database\Migrations\Migration;
    6.  
    7. class CreatePublishersTable extends Migration
    8. {
    9.     /**
    10.      * Run the migrations.
    11.      *
    12.      * @return void
    13.      */
    14.     public function up()
    15.     {
    16.         Schema::create('publishers', function (Blueprint $table) {
    17.             $table->increments('id');
    18.             $table->string('name');
    19.             $table->timestamps();
    20.         });
    21.     }
    22.  
    23.     /**
    24.      * Reverse the migrations.
    25.      *
    26.      * @return void
    27.      */
    28.     public function down()
    29.     {
    30.         Schema::dropIfExists('publishers');
    31.     }
    32. }
    PHP:
    1. <?php
    2.  
    3. use Illuminate\Support\Facades\Schema;
    4. use Illuminate\Database\Schema\Blueprint;
    5. use Illuminate\Database\Migrations\Migration;
    6.  
    7. class CreateEquipmentTable extends Migration
    8. {
    9.     /**
    10.      * Run the migrations.
    11.      *
    12.      * @return void
    13.      */
    14.     public function up()
    15.     {
    16.         Schema::create('equipments', function (Blueprint $table) {
    17.             $table->increments('id');
    18.             $table->string('name');
    19.             $table->integer('publisher_id');
    20.             $table->integer('technical_attribute_id');
    21.             $table->timestamps();
    22.             $table->foreign('publisher_id')->references('id')->on('publishers');
    23.             $table->foreign('technical_attribute_id')->references('id')->on('technical_attributes');
    24.         });
    25.     }
    26.  
    27.     /**
    28.      * Reverse the migrations.
    29.      *
    30.      * @return void
    31.      */
    32.     public function down()
    33.     {
    34.         Schema::dropIfExists('equipments');
    35.     }
    36. }
    PHP:
    1. <?php
    2. namespace App\Http\Controllers;
    3. use App\Equipment;
    4. use Illuminate\Http\Request;
    5. class EquipmentController extends Controller
    6. {
    7.     public function index()
    8.     {
    9.         return view('equipments.index', [
    10.             'equipments' => Equipment::get(),
    11.         ]);
    12.     }
    13.  
    14.     public function create()
    15.     {
    16.         return view('equipments.create', [
    17.             'equipment' =>[],
    18.         ]);
    19.     }
    20.  
    21.     public function store(Request $request)
    22.     {
    23.         Equipment::create($request->all());
    24.  
    25.         return redirect()->back();
    26.     }
    27.  
    28.     public function edit(Equipment $equipment)
    29.     {
    30.         return view('equipments.edit', [
    31.             'equipment' => $equipment,
    32.         ]);
    33.     }
    34.  
    35.     public function update(Request $request, Equipment $equipment)
    36.     {
    37.         $equipment->update($request->all());
    38.         return redirect()->route('publisher.index');
    39.     }
    40. }
    PHP:
    1. <?php
    2. namespace App\Http\Controllers;
    3. use App\Publisher;
    4. use Illuminate\Http\Request;
    5. class PublisherController extends Controller
    6. {
    7.     public function index()
    8.     {
    9.         return view('publishers.index', [
    10.             'publishers' => Publisher::get(),
    11.         ]);
    12.     }
    13.  
    14.     public function create()
    15.     {
    16.         return view('publishers.create', [
    17.             'publisher' => [],
    18.         ]);
    19.     }
    20.  
    21.     public function store(Request $request)
    22.     {
    23.         $publisher = Publisher::create($request->all());
    24.  
    25.         return redirect()->route('publisher.show', $publisher);
    26.     }
    27.  
    28.     public function show(Publisher $publisher)
    29.     {
    30.         return view('publishers.show', ['publisher' => $publisher]);
    31.     }
    32.  
    33.     public function edit(Publisher $publisher)
    34.     {
    35.         return view('publishers.edit', [
    36.             'publisher' => $publisher,
    37.         ]);
    38.     }
    39.  
    40.     public function update(Request $request, Publisher $publisher)
    41.     {
    42.         $publisher->update($request->all());
    43.  
    44.         return redirect()->route('publisher.show', $publisher);
    45.     }
    46.  
    47.     public function destroy(Publisher $publisher)
    48.     {
    49.         $publisher->delete();
    50.         return redirect()->route('publisher.index');
    51.     }
    52. }
    А как мне поступить если таблица Equipments у меня связывается не только с 1 таблицей Publisher а например еще с 5 таблицами. Как в описании 3 таблиц в начале вопроса?
    забыл еще
    PHP:
    1. <?php
    2.  
    3. namespace App;
    4.  
    5. use Illuminate\Database\Eloquent\Model;
    6.  
    7. class Publisher extends Model
    8. {
    9.     protected $guarded = [];
    10.  
    11.     public function equipment()
    12.     {
    13.         return $this->hasMany('App\Equipment');
    14.     }
    15. }
     
  2. Feonix89

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    вроде бы получилось путем добавления второй функции в основной модели, но правильно ли так? и получается, чтобы сейчас мне создать оборудование приходится указывать номер id