Laravel Seed从另一个表的列更新列

时间:2017-03-27 09:11:29

标签: php database laravel-5 laravel-seeding

我正在使用两张桌子。

例如,我将使用帖子。

第一个是帖子表

id|name |author|author_id|country
1 |test |Devin |1        |South Africa
2 |test2|James |2        |Whales
3 |test3|Devin |1        |South Africa

然后我有作者表

id|name
1 |Devin
2 |James

我想将国家/地区添加到作者表中。所以我进行了迁移,让我的表看起来像这样

id|name  |country
1 |Devin |NULL
2 |James |NULL

现在我想要实现的是编写一个数据库播种器,它将根据posts表将各国种子放入authors表中。

我想获取该author_id的帖子国家/地区,然后将该国家/地区插入到作者表中,以便它看起来像这样

id|name  |country
1 |Devin |South Africa
2 |James |Whales

我的问题是,是否可以使用播种机来完成此操作?或者有没有更好的方法来做到这一点,而无需为每个作者手动执行此操作。

我想做这样的事情

<?php

use Illuminate\Database\Seeder;

class AlterOperatorsData extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $authors = App\Author::all();

        foreach ($authors as $author) {
            $country = App\Post::where('author_id', $author->id)->get()->first();
            DB::table('authors')->update([
                'country' => $country->country
            ]);
        }
    }
}

但看起来它会做一些繁重的工作,任何人都可以提出更好的方法,甚至可以看看当前的方法,看看它是否可以改进?

1 个答案:

答案 0 :(得分:0)

那么就像OP在评论中解释的那样,我可以建议他的功能进行小的优化。您无需同时使用get()first(),只有first()才能完成此任务:

而不是

$country = App\Post::where('author_id', $author->id)->get()->first();

使用

$country = App\Post::where('author_id', $author->id)->first();