Laravel 工厂关联仅关联最后的数据。如何解决这个问题?

2024-04-28

我有两个模型需要在创建数据后关联。我已经问过了here https://stackoverflow.com/questions/58742894/how-to-associate-data-from-a-different-factory并得到了答案。我实现了它并做了一些修改,因为它没有正确关联数据。现在我对协会有疑问。它仅与最后的数据相关联。

我期望的是从工厂创建的所有数据都是相互关联的。

当我做php artisan tinker并运行App\App::first()->load('menus', 'menus.page')命令,它没有给我正确的数据。请看一下结果here https://pastebin.com/ri9MbFuN.

正如您所看到的,正确的数据仅显示在最后一个对象上。剩下的就是null。我怎样才能解决这个问题?请看一下下面我的种子文件,我是否犯了任何错误?

<?php

use App\App;
use App\Component;
use App\Menu;
use App\Page;
use App\Role;
use App\Submenu;
use App\User;
use Illuminate\Database\Seeder;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $superadmin = Role::whereName('superadmin')->first();

        $tester = new User();
        $tester->name = "Tester";
        $tester->email = "[email protected] /cdn-cgi/l/email-protection";
        $tester->password = bcrypt('password');
        $tester->save();

        $tester->roles()->attach($superadmin);

        // Create 5 apps for each user
        $tester->apps()->saveMany(factory(App::class, 5)->make())->each(function ($app) {
            $menus = factory(Menu::class, 5)->make();
            $pages = factory(Page::class, 5)->make();

            // Create 5 menus for each app and 5 submenus for each menu
            $app->menus()->saveMany($menus)->each(function ($menu) use ($pages) {
                // Associate page with each menu
                $pages->each(function ($page) use ($menu) {
                    $page->menu()->associate($menu);
                });

                // Create 5 submenus for each menu
                $menu->submenus()->saveMany(factory(Submenu::class, 5)->make())->each(function ($submenu) use ($pages) {
                    // Associate page with each submenu
                    $pages->each(function ($page) use ($submenu) {
                        $page->submenu()->associate($submenu);
                    });
                });
            });

            // Create 5 pages for each app and 5 components for each page
            $app->pages()->saveMany($pages)->each(function ($page) {
                $page->components()->saveMany(factory(Component::class, 5)->make());
            });
        });
    }
}

Update

这是我的模型文件,请看一下:

App.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class App extends Model
{
    /**
     * The attributes that should not be mass assignable.
     *
     * @var array
     */
    protected $guarded = ['id'];

    /**
     * Each app belongs to a user.
     *
     * @return \Illuminate\Database\Eloquent\Relationship\BelongsTo
     */
    public function user()
    {
        return $this->belongsTo(User::class);
    }

    /**
     * Each app has many pages.
     *
     * @return \Illuminate\Database\Eloquent\Relationship\HasMany
     */
    public function pages()
    {
        return $this->hasMany(Page::class);
    }

    /**
     * Each app has many menus.
     *
     * @return \Illuminate\Database\Eloquent\Relationship\HasMany
     */
    public function menus()
    {
        return $this->hasMany(Menu::class);
    }
}

Menu.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Menu extends Model
{
    /**
     * The attributes that should not be mass assignable.
     *
     * @var array
     */
    protected $guarded = ['id'];

    /**
     * Each menu belongs to a app.
     *
     * @return \Illuminate\Database\Eloquent\Relationship\BelongsTo
     */
    public function app()
    {
        return $this->belongsTo(App::class);
    }

    /**
     * Each menu has one page.
     * 
     * @return \Illuminate\Database\Eloquent\Relationship\HasOne
     */
    public function page()
    {
        return $this->hasOne(Page::class);
    }

    /**
     * Each menu has many submenus.
     *
     * @return \Illuminate\Database\Eloquent\Relationship\HasMany
     */
    public function submenus()
    {
        return $this->hasMany(Submenu::class);
    }

    /**
     * Each menu belongs to many roles.
     *
     * @return \Illuminate\Database\Eloquent\Relationship\BelongsToMany
     */
    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
}

Page.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Page extends Model
{
    /**
     * The attributes that should not be mass assignable.
     *
     * @var array
     */
    protected $guarded = ['id'];

    /**
     * Each page belongs to an app.
     *
     * @return \Illuminate\Database\Eloquent\Relationship\BelongsTo
     */
    public function app()
    {
        return $this->belongsTo(App::class);
    }

    /**
     * Each page has many components.
     *
     * @return \Illuminate\Database\Eloquent\Relationship\HasMany
     */
    public function components()
    {
        return $this->hasMany(Component::class);
    }

    /**
     * Each page belongs to a menu.
     *
     * @return \Illuminate\Database\Eloquent\Relationship\BelongsTo
     */
    public function menu()
    {
        return $this->belongsTo(Menu::class);
    }

    /**
     * Each page belongs to a submenu.
     *
     * @return \Illuminate\Database\Eloquent\Relationship\BelongsTo
     */
    public function submenu()
    {
        return $this->belongsTo(Submenu::class);
    }
}


好吧,事实上你确实犯了一个错误。通过循环菜单循环内的每个页面。因此,在第一次运行时,每个页面都将与第一个菜单条目相关联。在第二次中,运行带有第二个菜单条目的每个页面,依此类推。最终导致这样一个事实:每个页面都与最后一个菜单条目相关联。

为了保持结构像你一样可以做这样的事情:

        $tester = new \App\User();
    $tester->name = "Tester";
    $tester->email = "[email protected] /cdn-cgi/l/email-protection";
    $tester->password = bcrypt('password');
    $tester->save();


    // Create 5 apps for each user
    $tester->apps()->saveMany(factory(\App\App::class, 5)->make())->each(function ($app) {
        $menus = factory(\App\Menu::class, 5)->make();
        $pages = factory(\App\Page::class, 5)->make();

        $pagesIterator = $pages->getIterator();

        // Create 5 menus for each app and 5 submenus for each menu
        $app->menus()->saveMany($menus)->each(function ($menu) use ($pagesIterator) {

            $page = current($pagesIterator);
            $page->menu()->associate($menu);

            // Create 5 submenus for each menu
            $menu->submenus()->saveMany(factory(\App\Submenu::class, 5)->make())->each(function ($submenu) use ($page) {
                // Associate page with each submenu
                $page->submenu()->associate($submenu);
            });

            next($pagesIterator);
        });

        // Create 5 pages for each app and 5 components for each page
        $app->pages()->saveMany($pages)->each(function ($page) {
            $page->components()->saveMany(factory(\App\Component::class, 5)->make());
        });

    });

因此,我们只需通过迭代器从循环内的集合中获取下一页,并将每个菜单与集合中的下一页相关联。 (请注意,如果您希望每个子菜单都有一个不同的关联页面,则需要创建更多页面......)

无关:

$page->menu()->associate($menu);

通常需要一个$page->save()其次,因为 Associate() 方法不会自动保存。在您的情况下, $pages 通过调用持久化到数据库$app->pages()->saveMany($pages)在最后。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel 工厂关联仅关联最后的数据。如何解决这个问题? 的相关文章

  • facebook og:image 不会从与 URL 相呼应的 php 文件中获取图像

    facebook OG 从回显 URL 获取图像 这可能吗 因为我包含了一个 php 文件 它将回显图像 URL 但是当我签入共享调试器时 内容为空 我的元标签 gt 和 php 文件
  • 尝试在本地主机上测试我的 php 文件,但只出现一个空白页面,没有错误消息

    我正在运行 Apache 和 mySQL 因为我检查了所有日志 似乎没有任何错误 我的目标是每当有新的表单条目时就向特定地址发送电子邮件 我对后端和 PHP 缺乏经验 所以我不太确定哪里出了问题 任何帮助将不胜感激
  • 是否需要使用fetch_object或fetch_array?

    我最近发现我可以打印数据库中的结果而不使用mysqli fetch object功能 例如 假设我们有一个简单的 sql select 语句 可以使用如下所示的语句来执行 conn mysqli connect localhost root
  • 使用 PHP 将表单数据发送/发布到 URL [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有一个通过 POST 提交的表单 提交表单后我捕获变量 如何连接表单数据 然后将其 POST 到 url 然后重新定向到感谢页面 这不是确
  • magento 删除管理菜单项

    在magento中 是否可以删除管理中的菜单项 我有一个新模块 并将评论和评级拉到一个新部分 我不反对将它们也留在目录部分 但如果可能 并且干净 我想将其从那里删除 将下一行添加到扩展 config xml 文件
  • PHP 强制 Apache 错误

    感谢这个论坛 我了解到 PHP header 函数实际上并不将 header 发送到 Apache 服务器 而只发送到客户端 我想要做的是生成错误 500 并让 Apache 显示其相应的页面 有办法强制吗 提前致谢 还有 Allez le
  • 如何使用 Angular4 进行 Codeigniter 视图?

    首先 我的 PHP Codeigniter 项目当前在服务器上运行 然后我在服务器上安装了最新的 Angular4 CLI Typescript 但我不知道如何与Codeigniter项目集成 如何像 AngularJS 一样在 Codei
  • 通过自定义文本更改库存文本中的 WooCommerce 产品可用性

    我想更改库存数量后面的 有库存 文字 我尝试在我的 WordPress php 编辑器中添加此 PHP 代码 但它不起作用 你知道为什么吗 谢谢 add filter woocommerce get availability text bb
  • 无循环按键对多维数组求和

    我有这个 Array 0 gt Array f count gt 1 uid gt 105 1 gt Array f count gt 0 uid gt 106 2 gt Array f count gt 2 uid gt 107 3 gt
  • MySQL:如何获取上次更新的更改

    我正在使用 MySQL 和 PHP 开发数据库应用程序 此时我正在尝试获取上次更新引起的更改 我解决问题的第一个方法是 使用 SELECT 获取 旧 状态 使用 UPDATE 进行更改 使用 SELECT 获取 新 状态 将数组与 php
  • Javascript 闭包与 PHP 闭包,有什么区别?

    JS 中的闭包和 PHP 中的闭包有什么区别 它们的工作方式几乎相同吗 在 PHP 中编写闭包时有什么需要注意的注意事项吗 一个区别是两者如何处理存储执行匿名函数的上下文 JavaScript var a 1 var f function
  • Mailgun 内联图像,它是如何工作的?

    我正在使用 mailgun 并希望将图像添加到我的时事通讯中 现在我这样做了 mg gt sendMessage domain array from gt email protected cdn cgi l email protection
  • 如何向 opencart 管理添加新模块?

    我想在 opencart 管理中将子菜单项 位置 添加到 目录 菜单项 在选择位置时 我想看到我自己的位置管理视图页面 该页面与 opencart 数据库中我自己的位置表相互关联 请让我知道在哪里以及创建什么 mvc 才能在开放购物车中实现
  • 如何通过htaccess在codeigniter中隐藏index.php和控制器名称

    我想从我的 codeignier url 网站隐藏 index php 和控制器名称 我也想替换这个术语 seo test product ad test product 我在下面提到了我的 htaccess 文件 请指导我如何解决这个问题
  • PHP:检查任何基于拉丁语的语言中的字母字符?

    使用 PHP 我想检查一个字符串仅包含字母字符 我不想允许任何数字或特殊字符 例如 ctype alpha 对于这个目的来说似乎很棒 问题是我想允许重音字母 例如法语等 例如 我想允许 L rien 我知道ctype alpha 可以与se
  • 使用单个查询和每用户密码盐进行用户登录

    我决定使用存储在数据库中的每用户盐来实现用户登录 盐作为密码的前缀 该密码使用 SHA 进行哈希处理并存储在数据库中 过去 当我不使用盐时 我会使用典型的方法 使用用户输入的用户名和密码来计算查询返回的行数 然而 对于每个用户的盐 您需要先
  • 使用 dockerfile 在 docker 中安装 mongodb 驱动

    我有一个 mongodb docker 容器 我需要另一个安装了 php 和 apache 的 docker 容器 我想从这个容器运行一个 php 脚本并将一些数据发送到 mongodb 容器以将数据保存在 mongodb 数据库中 所以我
  • 在 MySQL 表中存储用户密码的最佳 PHP 哈希方法?

    我已经阅读 Stack Overflow 问题大约 15 分钟了 每一个问题似乎都与我之前读到的问题相矛盾 Bcrypt SHA1 MD5 等 我目前对我的密码进行 MD5 但我想让我的数据库在发生泄露时更加安全 我知道这个问题已经被问了一
  • PHP 文件由浏览器下载,而不是由本地开发服务器(MAMP)处理

    一切都很顺利 直到我添加AddHandler application x httpd php5s php到本地服务器文档根目录中的 htaccess 文件 根据我正在使用的站点 我经常更改该文件 因为我访问时这样做了http 本地主机 88
  • PHP UTF-8 配置

    我正在使用 PHP 5 3 5 配置 Apache 2 2 17 服务器 我的目标是创建一个默认为内容类型的干净配置UTF 8 php ini default charset UTF 8 default mimetype applicati

随机推荐