Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Есть две таблицы: объекты и жанры. Каждый объект может иметь много жанров, поэтому я создал 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)
Не в сети
Во первых делать не на коленке.
Как?
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();
}
}
.....
Не в сети
Во вторых, этот пост был основан на документации - читай внимательно, и самое главное и самое важное старайся формулировать вопрос правильно, что зачастую сразу даёт ответ.
Не в сети
Страницы 1