admin 发表于 2023-3-12 14:51:26

Laravel 中模型关联的几种用法总结

<p style="box-sizing:inherit;margin-top:0px;margin-bottom:20px;line-height:inherit;color:rgb(51,51,51);font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;white-space:normal;background-color:rgb(255,255,255);"><code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">Laravel</code> 中的模型关联为我们使用带来了极大遍历,今天总结一下几种常见的模式和用法。</p>

<p><span style="box-sizing:inherit;color:#333333;font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;background-color:#FFFFFF;"></span><span style="color:#333333;font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;background-color:#FFFFFF;"></span></p>

<h2 style="box-sizing:inherit;font-family:'PingFang SC', 'Helvetica Neue', 'Microsoft YaHei UI', 'Microsoft YaHei', 'Noto Sans CJK SC', Sathu, EucrosiaUPC, Arial, Helvetica, sans-serif;line-height:1.8;margin:22px 0px 16px;padding:0px;font-size:24px;border:none;color:rgb(51,51,51);white-space:normal;background-color:rgb(255,255,255);">一对多</h2>

<p style="box-sizing:inherit;margin-top:0px;margin-bottom:20px;line-height:inherit;color:rgb(51,51,51);font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;white-space:normal;background-color:rgb(255,255,255);">举例说明,<code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">Post</code> ↔ <code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">Comment</code></p>

<pre class="hljs php">class Post extends Model {    public function comments() {        return $this->hasMany(Comment::class);
    }
}class Comment extends Model {    public function post() {        return $this->belongsTo(Post::class);
    }
}</pre>

<p style="box-sizing:inherit;margin-top:0px;margin-bottom:20px;line-height:inherit;color:rgb(51,51,51);font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;white-space:normal;background-color:rgb(255,255,255);">执行 SQL 数量</p>

<p style="box-sizing:inherit;margin-top:0px;margin-bottom:20px;line-height:inherit;color:rgb(51,51,51);font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;white-space:normal;background-color:rgb(255,255,255);">如果使用 with 时,会一个查询会拆解为两个 SQL,一个是查找 Post,一个是查找 <code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">Comment</code>(该查找使用的是 <code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">select in</code> 方法,多个 <code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">Post</code> 只执行一次 <code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">Comment</code> 的查询工作)</p>

<p style="box-sizing:inherit;margin-top:0px;margin-bottom:20px;line-height:inherit;color:rgb(51,51,51);font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;white-space:normal;background-color:rgb(255,255,255);">用法(使用 <code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">with</code>)</p>

<p style="box-sizing:inherit;margin-top:0px;margin-bottom:20px;line-height:inherit;color:rgb(51,51,51);font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;white-space:normal;background-color:rgb(255,255,255);"><code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">$comments = Post::with('comments')->find(1)->comments</code></p>

<p style="box-sizing:inherit;margin-top:0px;margin-bottom:20px;line-height:inherit;color:rgb(51,51,51);font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;white-space:normal;background-color:rgb(255,255,255);">用法(使用 <code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">load</code>)</p>

<p style="box-sizing:inherit;margin-top:0px;margin-bottom:20px;line-height:inherit;color:rgb(51,51,51);font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;white-space:normal;background-color:rgb(255,255,255);"><code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">$post = Post::find(1)</code></p>

<p style="box-sizing:inherit;margin-top:0px;margin-bottom:20px;line-height:inherit;color:rgb(51,51,51);font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;white-space:normal;background-color:rgb(255,255,255);"><code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">$post->load('comments')</code></p>

<p style="box-sizing:inherit;margin-top:0px;margin-bottom:20px;line-height:inherit;color:rgb(51,51,51);font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;white-space:normal;background-color:rgb(255,255,255);">load 是对已经查出的模型使用,with 是直接做好关联关系的查询,两者查询的 sql 是一样的 。</p>

<p><span style="box-sizing:inherit;color:#333333;font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;background-color:#FFFFFF;"></span><span style="color:#333333;font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;background-color:#FFFFFF;"></span></p>

<h2 style="box-sizing:inherit;font-family:'PingFang SC', 'Helvetica Neue', 'Microsoft YaHei UI', 'Microsoft YaHei', 'Noto Sans CJK SC', Sathu, EucrosiaUPC, Arial, Helvetica, sans-serif;line-height:1.8;margin:22px 0px 16px;padding:0px;font-size:24px;border:none;color:rgb(51,51,51);white-space:normal;background-color:rgb(255,255,255);">多对多</h2>

<p style="box-sizing:inherit;margin-top:0px;margin-bottom:20px;line-height:inherit;color:rgb(51,51,51);font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;white-space:normal;background-color:rgb(255,255,255);">举例说明,<code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">User``` ↔ ```Role</code></p>

<pre class="hljs php">class Role extends Model {
}class User extends Model {    public function roles() {        return $this->belongsToMany(Role::class, 'user_role', 'roleId', 'userId');
    }
}</pre>

<p style="box-sizing:inherit;margin-top:0px;margin-bottom:20px;line-height:inherit;color:rgb(51,51,51);font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;white-space:normal;background-color:rgb(255,255,255);">用法(使用 <code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">with</code>)</p>

<p style="box-sizing:inherit;margin-top:0px;margin-bottom:20px;line-height:inherit;color:rgb(51,51,51);font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;white-space:normal;background-color:rgb(255,255,255);"><code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">$roles = User::with('roles')->find(1)->roles;</code></p>

<p style="box-sizing:inherit;margin-top:0px;margin-bottom:20px;line-height:inherit;color:rgb(51,51,51);font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;white-space:normal;background-color:rgb(255,255,255);">用法(使用 <code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">load</code>)</p>

<p style="box-sizing:inherit;margin-top:0px;margin-bottom:20px;line-height:inherit;color:rgb(51,51,51);font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;white-space:normal;background-color:rgb(255,255,255);"><code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">$user = User::find(1);</code></p>

<p style="box-sizing:inherit;margin-top:0px;margin-bottom:20px;line-height:inherit;color:rgb(51,51,51);font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;white-space:normal;background-color:rgb(255,255,255);"><code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">$user->load('roles');</code></p>

<p style="box-sizing:inherit;margin-top:0px;margin-bottom:20px;line-height:inherit;color:rgb(51,51,51);font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;white-space:normal;background-color:rgb(255,255,255);"><code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">load</code> 是对已经查出的模型使用,<code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">with</code> 是直接做好关联关系的查询,两者查询的 sql 是一样的 。</p>

<p><span style="box-sizing:inherit;color:#333333;font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;background-color:#FFFFFF;"></span><span style="color:#333333;font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;background-color:#FFFFFF;"></span></p>

<h2 style="box-sizing:inherit;font-family:'PingFang SC', 'Helvetica Neue', 'Microsoft YaHei UI', 'Microsoft YaHei', 'Noto Sans CJK SC', Sathu, EucrosiaUPC, Arial, Helvetica, sans-serif;line-height:1.8;margin:22px 0px 16px;padding:0px;font-size:24px;border:none;color:rgb(51,51,51);white-space:normal;background-color:rgb(255,255,255);">一对一</h2>

<p style="box-sizing:inherit;margin-top:0px;margin-bottom:20px;line-height:inherit;color:rgb(51,51,51);font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;white-space:normal;background-color:rgb(255,255,255);">举例说明,<code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">User</code> ↔ <code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">Profile</code></p>

<pre class="hljs php">class User extends Model {    public function profile() {        return $this->hasOne(Profile::class,'id');
    }
}class Profile extends Model {
}</pre>

<p style="box-sizing:inherit;margin-top:0px;margin-bottom:20px;line-height:inherit;color:rgb(51,51,51);font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;white-space:normal;background-color:rgb(255,255,255);">用法(使用 <code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">with</code>)</p>

<p style="box-sizing:inherit;margin-top:0px;margin-bottom:0px;line-height:inherit;color:rgb(51,51,51);font-family:'-apple-system', BlinkMacSystemFont, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:16px;white-space:normal;background-color:rgb(255,255,255);"><code style="box-sizing:inherit;font-family:Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;font-size:13px;margin:0px 3px;padding:3px 4px;border:none;border-radius:4px;background:rgb(246,246,246);">$user = User::with('profile')</code></p>
页: [1]
查看完整版本: Laravel 中模型关联的几种用法总结