Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 21.05.2015 12:40:38

Выборка с БД через 3ю таблицу

Есть две таблицы: объекты и жанры. Каждый объект может иметь много жанров, поэтому я создал 3ю таблицу, в которой хранятся эти связи.
Ее структура проста: ид, ид_объекта, ид_жанра.

        $obj = Object::find($obj_id);
        if(!$obj){
            return \App::abort(404);
        }
        $sect = Section::find($obj->section_id);
        $genres = Gen_obj::where('obj_id', '=', $obj_id)->get();

Таким образом я получаю все идентификаторы жанров, но вне еще и надо достать ихние имена из таблицы жанров. Как это можно сделать?

Изменено recew (21.05.2015 12:41:41)

Не в сети

#2 26.05.2015 15:23:14

Re: Выборка с БД через 3ю таблицу

Во первых делать не на коленке.
Как?
1. Создать модель Книги (создаст миграцию)

php artisan make:model Book

1.1. Допустим модель Книги такова

<?php namespace App;
use Illuminate\Database\Eloquent\Model;
class Book extends Model
{
    // таблица
    protected $table = 'books';
    // заполняемые поля в админке (например)
    protected $fillable = [
        'title',
        'description'
    ];
    // коллекция, вернёт все жанры выбранной книги
    public function genres()
    {
        return $this->belongsToMany('App\Genres');
    }
}

2. Создать модель Жанров (создаст миграцию)

php artisan make:model Genre

2.1. Допустим, модель такова

<?php namespace App;
use Illuminate\Database\Eloquent\Model;
class Genre extends Model
{
    // таблица
    protected $table = 'genres';
    // заполняемые поля в админке (например)
    protected $fillable = [
        'title'
    ];
    // коллекция, вернёт все книги выбранного жанра
    public function books()
    {
        return $this->belongsToMany('App\Book');
    }
}

3. Отредактировать миграции
3.1. Книга

<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateBooksTable extends Migration {
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('books', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('title')->index();
            $table->text('description')->nullable()->default(NULL);
            $table->timestamps();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('books');
    }
}

3.2. Жанры

<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateGenresTable extends Migration {
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('genres', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('title')->index();
            $table->timestamps();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('genres');
    }
}

4. Применить миграцию, чтобы таблицы в БД существовали

php artisan migrate

5. СОЗДАТЬ ПИВОТ (создаёт миграцию)
НЕ РЕДАКТИРУЙ, но смотри

<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateBookGenrePivotTable extends Migration {
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('book_genre', function(Blueprint $table)
        {
            $table->integer('book_id')->unsigned()->index();
            $table->integer('genre_id')->unsigned()->index();
            $table->foreign('book_id')->references('id')->on('books')->onDelete('cascade');
            $table->foreign('genre_id')->references('id')->on('genres')->onDelete('cascade');
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('book_genre');
    }
}

6. Применить миграцию с пивотом

php artisan migrate

Вследствии чего где-либо (за пример возьмём контроллер) работаешь таким образом:
Скажем, что это тело метода index() контроллера HomeController

.....
public function index()
{
    // все книги (без жанров)
    $books = Book::all();
    dd($books->toArray())
    // все книги с жанрами
    $return = [];
    $books = new Book;
    foreach( $books->with('genres')->get() as $book ) {
        $return[$book->id] = $book->toArray();
    }
    dd($return, $books);
    // книга с жанрами
    $book = Book::with('genres')->find(1);
    dd($book);
    // жанр №1 со всеми книгами
    $genre = Genre::with('books')->find(1);
    dd($genre);
    // все жанры со всеми книгами
    $return = [];
    $genres = new Genre;
    foreach( $genres->with('books')->get() as $genre ) {
        $return[$genre->id] = $genre->toArray();
    }
}
.....

Не в сети

#3 26.05.2015 15:24:12

Re: Выборка с БД через 3ю таблицу

Во вторых, этот пост был основан на документации - читай внимательно, и самое главное и самое важное старайся формулировать вопрос правильно, что зачастую сразу даёт ответ.

Не в сети

Подвал раздела