Laravel 雄辩的关系:完整指南

Eloquent 使管理和处理这些关系变得顺畅,并支持几种不同类型的关系:

  • 一对一
  • 一对多
  • 多对多
  • 有很多通过
  • 多态关系
  • 多对多多态关系

如果你想了解有关 Laravel 的更多信息,请查看以下链接。

  • https://appdividend.com/category/laravel/

Laravel 雄辩的关系

Laravel 中的 Eloquent 关系被定义为 Eloquent 模型类的方法。 它就像 Eloquent 模型本身; 关系还用作基本的查询构建器,将关系表示为方法,提供强大的方法链接和查询功能。

第一步:配置 Laravel项目

通过以下命令安装。

composer create-project laravel/laravel --prefer-dist Relationships

设置 MySQL 数据库。

现在,编辑 .env 文件。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=relationship
DB_USERNAME=root
DB_PASSWORD=mysql

现在,我们需要制作三个表来建立它们之间的关系。

  1. 订单表
  2. 项目表
  3. 发票表
php artisan make:migration create_items_table
php artisan make:migration create_orders_table
php artisan make:migration create_invoice_table

定义这些表的架构。

increments('id');
            $table->string('item_name');
            $table->integer('price');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */    public function down()
    {
        Schema::dropIfExists('items');
    }
}
increments('id');
            $table->integer('user_id');
            $table->integer('item_id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */    public function down()
    {
        Schema::dropIfExists('orders');
    }
}
increments('id');
            $table->integer('user_id');
            $table->integer('order_id');
            $table->integer('paid_amount');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */    public function down()
    {
        Schema::dropIfExists('invoice');
    }
}

接下来,键入以下命令。

php artisan migrate

它将在数据库中创建所有五个表。

步骤2:将虚拟数据填充到数据库中。

键入以下命令以生成种子文件。

php artisan make:seeder UsersTableSeeder
php artisan make:seeder ItemsTableSeeder
php artisan make:seeder OrdersTableSeeder
php artisan make:seeder InvoiceTableSeeder

为这些表提供值。

insert([
            'name' => str_random(10),
            'email' => str_random(10).'@gmail.com',
            'password' => bcrypt('secret'),
        ]);
          DB::table('users')->insert([
            'name' => str_random(10),
            'email' => str_random(10).'@gmail.com',
            'password' => bcrypt('secret'),
        ]);
           DB::table('users')->insert([
            'name' => str_random(10),
            'email' => str_random(10).'@gmail.com',
            'password' => bcrypt('secret'),
        ]);
            DB::table('users')->insert([
            'name' => str_random(10),
            'email' => str_random(10).'@gmail.com',
            'password' => bcrypt('secret'),
        ]);
             DB::table('users')->insert([
            'name' => str_random(10),
            'email' => str_random(10).'@gmail.com',
            'password' => bcrypt('secret'),
        ]);
    }
}
insert([
            'item_name' => 'mobile',
            'price' => 1000
        ]);
         DB::table('items')->insert([
            'item_name' => 'laptop',
            'price' => 2000
        ]);
          DB::table('items')->insert([
            'item_name' => 'camera',
            'price' => 500
        ]);
           DB::table('items')->insert([
            'item_name' => 'ipod',
            'price' => 200
        ]);
            DB::table('items')->insert([
            'item_name' => 'tabs',
            'price' => 800
        ]);
    }
}
insert([
            'user_id' => 1,
            'order_id' => 1,
            'paid_amount' => 1000
        ]);
         DB::table('invoice')->insert([
            'user_id' => 3,
            'order_id' => 2,
            'paid_amount' => 4000
        ]);
          DB::table('invoice')->insert([
            'user_id' => 4,
            'order_id' => 4,
            'paid_amount' => 1000
        ]);
           DB::table('invoice')->insert([
            'user_id' => 5,
            'order_id' => 5,
            'paid_amount' => 1000
        ]);
            DB::table('invoice')->insert([
            'user_id' => 2,
            'order_id' => 3,
            'paid_amount' => 1000
        ]);
    }
}
insert([
            'user_id' => 1,
            'item_id' => 1
        ]);
        DB::table('orders')->insert([
            'user_id' => 1,
            'item_id' => 5
        ]);
        DB::table('orders')->insert([
            'user_id' => 2,
            'item_id' => 2
        ]);
        DB::table('orders')->insert([
            'user_id' => 4,
            'item_id' => 3
        ]);
        DB::table('orders')->insert([
            'user_id' => 5,
            'item_id' => 1
        ]);
    }
}

现在,最后,在 DatabaseSeeder.php 文件中调用所有这些类。

call(UsersTableSeeder::class);
        $this->call(OrdersTableSeeder::class);
        $this->call(ItemsTableSeeder::class);
        $this->call(InvoiceTableSeeder::class);
    }
}

因此,它填充了查询中描述的值。

第 3 步:为所有这三个新表制作模型。

键入以下命令。

php artisan make:model Item
php artisan make:model Order
php artisan make:model Invoice

一对多关系

“一对多”关系通常用于定义单个或一个模型拥有任何其他模型的关系。

在我们的示例中,用户可以有多个订单。

因此,在 User 模型中,我们可以编写以下函数。

hasMany(Order::class);
    }
}

现在,转到终端并键入以下命令。

php artisan tinker

在其中键入以下代码。

$orders = App\User::find(1)->orders;

因此,它将显示 user_id 为 1 的订单

Illuminate\Database\Eloquent\Collection {#734
     all: [
       App\Order {#738
         id: 1,
         user_id: 1,
         item_id: 1,
         created_at: null,
         updated_at: null,
       },
       App\Order {#741
         id: 2,
         user_id: 1,
         item_id: 5,
         created_at: null,
         updated_at: null,
       },
     ],
   }

如果你的表的本地主键不同,则id和外键与user_id不同。 然后,你需要像这样指定更多参数。

hasMany('App\Order', 'foreign_key', 'local_key');
}

一对多(反向)

现在我们可以访问下订单的用户了。

因此,在 Order.php 模型中,将以下函数放入其中。

belongsTo(User::class);
    }
}

转到修补程序并在其中键入以下代码。

 $user = App\Order::find(2)->user;

它将列出如下输出。

App\User {#735
 id: 1,
 name: "kbXBRnz9no",
 email: "9WQ1CwXjZY@gmail.com",
 created_at: null,
 updated_at: null,
 }

因此,我们可以找到下订单的用户。

最后,我们关于一对多关系的第一篇文章结束了。

另一个关系教程将在下一篇文章中发布。

如果你对 Laravel Eloquent 关系有任何疑问,请在下面的评测中提问。

资讯来源:由0x资讯编译自APPDIVIDEND,版权归作者Krunal所有,未经许可,不得转载
提示:投资有风险,入市需谨慎,本资讯不作为投资理财建议。请理性投资,切实提高风险防范意识;如有发现的违法犯罪线索,可积极向有关部门举报反映。
你可能还喜欢