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 關係有任何疑問,請在下面的評測中提問。