我有两张桌子,看起来是(迁移):
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');
});
'set'表用于存储应该查看帖子的位置(国家,城市......)的数据。例如,让我们存储一些国家:
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吗?
答案 0 :(得分:7)
好的,我找到了最好的解决方案。它是嵌套集模式。我使用了baum包,它看起来像是:
对于sets
表,我添加了Baum的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 :(得分:3)
您需要将地区,国家和城市分解为不同的表格,并建立这些OR之间的关系 您可以在一个表中列出所有组合,即ID |地区|国家|城市,因此每个包含国家和地区的城市都有单独的行。