2015-07-15 4 views
16

Я две таблицы, выглядит, что (миграция):Получить отчет по ID и все foreigns рекурсивны Laravel 5

Schema::create('sets', function(Blueprint $table) 
{ 
    $table->increments('id'); 

    $table->string('key'); 

    $table->string('name'); 

    $table->string('set_type'); 

    $table->integer('belongs_to')->unsigned(); 

    $table->timestamps(); 

    $table->foreign('belongs_to')->references('id')->on('sets')->onDelete('cascade'); 

}); 

Schema::create('posts', function(Blueprint $table) 
{ 
    $table->bigIncrements('id'); 

    $table->bigInteger('user_id')->unsigned(); 

    $table->bigInteger('set_id')->unsigned(); 

    $table->string('post_type', 25); 

    $table->text('post'); 

    $table->boolean('is_reported')->default(false); 

    $table->boolean('is_hidden')->default(false); 

    $table->timestamps(); 

    $table->foreign('user_id')->references('id')->on('users'); 
    $table->foreign('set_id')->references('id')->on('sets'); 

}); 

«набор», таблица для хранения данных, в которых местонахождение (страна, город ...) сообщение должно быть просмотрено. Например, давайте хранить некоторые страны:

id | key    | name  | belongs_to 
    1 | europe   | Europe  | null 
    2 | germany-all  | Germany  | 1 
    3 | germany-berlin | Berlin  | 2 
    4 | germany-frankfurt | Frankfurt | 2 
    5 | poland-all  | Poland  | 1 
    6 | poland-warsaw  | Warsaw  | 5 
    7 | england-all  | England  | 1 

И мой пост имеет set_id в 6. Глядя логически, когда я хочу получить сообщения из Европы (ID 1), что пост должен быть возвращен тоже, потому что 6 принадлежит 5 и 5 принадлежит 1. И это то, что я хочу сделать. Можно ли использовать слишком много PHP?

ответ

7

Хорошо, я нашел лучшее решение. Это шаблон вложенного набора. Я использовал baum пакет, и это выглядит, что:

Для sets таблицы я добавил colums Баума:

Schema::create('sets', function(Blueprint $table) { 
    $table->bigIncrements('id'); 
    $table->integer('parent_id')->nullable()->index(); 
    $table->integer('lft')->nullable()->index(); 
    $table->integer('rgt')->nullable()->index(); 
    $table->integer('depth')->nullable(); 

    $table->string('key'); 
    $table->string('name'); 
    $table->string('set_type'); 

    $table->timestamps(); 
}); 

И сделали! Просто получить set_id и вернуть сообщения, например:

$sets = Set::where('key', '=', $myKey)->first()->getDescendantsAndSelf()->lists('id'); 
$posts = Post::whereIn('set_id', $sets)->with(['user'])->take(6)->get(); 

Я оставляю это для потомков;)

+1

Вы также можете сделать '$ set = Set :: where ('key', '=', $ myKey) -> first() -> getDescendantsAndSelf() -> list ('id');' без использования foreach для loop, потому что 'getDescendantsAndSelf()' возвращает объект коллекции. – blackpla9ue

+0

@ blackpla9ue Спасибо, – Siper

+0

@ blackpla9ue, idk why, но он возвращает «Call to undefined method Baum \ Extensions \ Eloquent \ Collection :: list()»:/ – Siper

3

Необходимо разбить регион, страну и город на разные таблицы и установить связь между этими OR . Вы можете перечислить все комбинации в одной таблице. ID: | Регион | Страна | Город, чтобы у вас была отдельная строка для каждого города, содержащего страну и регион.

+0

Я мог бы сделать это, но это решение просто ограничено. Например, в будущем я хочу добавить окрестности в город. И у меня проблема. Более того, в некоторых странах существуют разные организации, например. У США есть штаты, в Польше у нас воеводы и т. Д. Поэтому я не могу использовать решение, которое вы указали. – Siper

+0

@Siper, если вы разбиваете сущности на таблицы, их легко расширить позже с округами, кварталами и т. Д. Кроме того, не имеет значения, какие страны называются в разных странах, если они эквивалентны между странами. – L4zl0w

Смежные вопросы