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
现在,我们需要制作三个表来建立它们之间的关系。
- 订单表
- 项目表
- 发票表
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 关系有任何疑问,请在下面的评测中提问。