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><hr>以下是回复内容:<br><hr><br>采集网址:<br>https://modstart.com/thread/837
页:
[1]