首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Laravel 5中通过ID和所有外国人递归获取记录

在Laravel 5中通过ID和所有外国人递归获取记录
EN

Stack Overflow用户
提问于 2015-07-15 17:58:07
回答 2查看 725关注 0票数 16

我有两个表,看起来(迁移):

代码语言:javascript
复制
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”表用于存储位置(国家、城市...)帖子应该是被查看的。例如,让我们存储一些国家/地区:

代码语言:javascript
复制
   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?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-20 21:19:58

好吧,我找到了最好的解决方案。它是嵌套的集合模式。我使用了baum包,它看起来是:

对于sets表,我添加了Baum的列:

代码语言:javascript
复制
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并返回帖子,例如:

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

我把这个留给子孙后代;)

票数 7
EN

Stack Overflow用户

发布于 2015-07-18 20:13:27

您需要将region、country和city分解为不同的表,并建立这些表之间的关系,或者您可以在一个表中列出所有组合,例如ID | region | Country | City,这样您就可以为每个包含国家和地区的城市单独一行。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31427227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档