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所有,未經許可,不得轉載
你可能還喜歡