<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # EloquentORM關聯關系之一對一 數據表之間往往不是孤立的,而是縱橫交叉、相互關聯的,比如一個用戶對應一個賬戶,一個賬戶只屬于一個用戶就屬于一對一關聯。 ## 軟件版本 * Laravel Version 5.4.19 * PHP Version 7.0.8 ## 關鍵字和數據表 * `hasOne()` * `belongsTo()` * `users` 和 `user_accounts` 表 數據操作之前請先配置好,數據庫的一些連接信息。例如下面使用mysql數據庫,修改項目根目錄下的 `.env` 文件內容。 ``` DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=db_name DB_USERNAME=db_username DB_PASSWORD=db_password ``` 一對一是最簡單的關聯關系,表示表A和表B的記錄一一對應。 比如一個用戶對應一個社交賬號,在演示該關聯關系之前我們先創建一個社交賬號表 `user_accounts` (**假設用戶表使用系統自帶的**) ## 生成模型和遷移文件 ```shell php artisan make:model UserAccount -m ``` ### 編輯遷移文件 `<project>/database/migrate/*_create_user_accounts_table.php`如下 ```php <?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateUserAccountsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('user_accounts', function (Blueprint $table) { $table->increments('id'); $table->integer('user_id')->unsigned(); $table->char('qq', 12)->nullable(); $table->string('wechat', 100)->nullable(); $table->string('weibo', 100)->nullable(); $table->timestamps(); $table->foreign('user_id') ->references('id') ->on('users') ->onUpdate('cascade') ->onDelete('cascade'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('user_accounts'); } } ``` ### 運行 php artisan 命令保存修改到數據庫 ```shell php artisan migrate ``` > 執行上面的命令后數據庫將生成四張表, > migrations > password_resets > user_accounts > users ## 定義關聯關系和修改模型的 fillable 屬性 并定義可填充的數據,即 `$fillable` 數組的值。 ``` <?php namespace App; use Illuminate\Database\Eloquent\Model; /** * Class UserAccount * * @package App */ class UserAccount extends Model { /** * @var array */ protected $fillable = ['user_id', 'qq', 'wechat', 'weibo']; } ``` ### 使用 tinker 填充數據 修改 `/databases/factories/ModelFactory.php`,新增關聯數據。 ``` <?php /* |-------------------------------------------------------------------------- | Model Factories |-------------------------------------------------------------------------- | | Here you may define all of your model factories. Model factories give | you a convenient way to create models for testing and seeding your | database. Just tell the factory how a default model should look. | */ /** @var \Illuminate\Database\Eloquent\Factory $factory */ $factory->define(App\User::class, function (Faker\Generator $faker) { static $password; return [ 'name' => $faker->name, 'email' => $faker->unique()->safeEmail, 'password' => $password ?: $password = bcrypt('secret'), 'remember_token' => str_random(10), ]; }); $factory->define(App\UserAccount::class, function (Faker\Generator $faker) { return [ 'user_id' => 1, 'qq' => $faker->numberBetween(100000, 999999999), 'wechat' => bcrypt('secret'), 'weibo' => bcrypt('secret') ]; }); ``` ### 執行上述遷移文件填充數據到數據庫 ```shell php artisan tinker // 進入到交互界面執行如下命令生成關聯數據 namespace App factory(User::class,1)->create() // 隨機生成一個用戶信息 factory(UserAccount::class,1)->create() // 隨機生成一個用戶關聯信息 ``` ### 查看執行結果 在兩個表中可以看到寫入的數據: `users`表數據: ![](https://box.kancloud.cn/e49bb91c260316fc3b9b61c7c67446e5_1231x79.png) `users_accounts`表: ![](https://box.kancloud.cn/8d9b34b24d86eb3141280eda2d2e2c3f_1232x79.png) ## 定義Eloquent關聯關系 文件在`<project>/app/User.php`和`<project>/app/UserAccount.php`。 ### 定義關聯關系 - 在 `User` 模型中定義與 `UserAccount` 模型的一對一對應關系 ```php <?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { ... /** * @return \Illuminate\Database\Eloquent\Relations\HasOne */ public function account() { /** * UserAccount::class related 關聯模型 * user_id foreignKey 當前表關聯字段 * id localKey 關聯表字段 */ return $this->hasOne(UserAccount::class, 'user_id', 'id'); } } ``` - 在 `UserAccount` 模型中定義與 `User` 的一對一關系 ```php <?php namespace App; use Illuminate\Database\Eloquent\Model; class UserAccount extends Model { ... /** * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function user() { /** * User::class related 關聯模型 * user_id ownerKey 當前表關聯字段 * id relation 關聯表字段 */ return $this->belongsTo(User::class, 'user_id', 'id'); } } ``` ## 關聯操作 ### 新增數據 同時新增 `users` 和 `user_accounts` 表數據 ``` $user = \App\User::create([ 'name' => 'curder', 'email' => 'curder@foxmail.com', 'password' => bcrypt('secret'), 'remember_token' => str_random(10), ]); // 新增一個用戶信息 $account = new \App\UserAccount(['qq' => 'qq Number', 'wechat' => 'wechatNumber', 'weibo' => 'weiboNumber']); // 生成 UserAccount 對象 $user->account()->save($account); // 執行關聯寫入操作 ``` > 也可以是我們使用 `find()` 方法獲得用戶信息(或者使用 `\Auth::id()`獲得用戶信息),再寫入到關聯表 `user_accounts`。如下:(這種情況常見于用戶修改創建、修改自己的賬戶信息) > ``` > $account = new \App\UserAccount(['qq' => 'another qq', 'wechat' => 'another wechat', 'weibo' => 'another weibo']); // 生成 UserAccount 對象,或者數據通過 Request 對象獲取 $account = new \App\Account($request->all()); > \Auth::user()->account()->save($account); > ``` ### 查詢數據 通過用戶獲取用戶關聯信息 ```php $user = User::find(1); // 獲取用戶表數據 $user->account; // 通過用戶信息獲取用戶關聯信息 ``` 通過用戶關聯信息獲取用戶信息 ```php $account = UserAccount::find(3); // 獲取用戶關聯信息 $account->user; // 通過關聯信息獲取用戶信息 ``` ### 關聯刪除 ``` $account = \App\UserAccount::find(1); $account->user->delete(); // 刪除用戶 users 表和 user_account 相關記錄 ``` ### 更新數據 通過用戶表 `users` 數據,更新關聯 `user_accounts` ``` $user = \App\User::find(1); $account = $user->account; // 獲取到關聯信息 $account->qq = 'new qq'; $account->wechat = 'new Wechat'; $account->save(); // 或者當用戶登錄時,直接通過關聯關系進行更新數據 \Auth::user()->account()->update(['qq' => 'new QQ', 'wechat' => 'new Wechat']); ``` 通過 用戶信息表 `user_accounts` 關聯更新 `users` 數據表 ``` $account = \App\UserAccount::find(1); $user = $account->user; // 獲取到關聯信息 $user->email = 'new@test.com'; $user->save(); ``` #### 通過關聯 User 數據 另外,如果需要同步更新關聯表的 `updated_at` 字段,在模型中定義 `$touches` 屬性,例如,我們在 UserAccount 中定義如下關系: ``` /** * 要觸發的所有關聯關系 * * @var array */ protected $touches = ['user']; ``` 在更新 `user_accounts` 表中數據時,同步更新 `users` 表的 `updated_at` 數據。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看