model 的 with 怎么写 join 的条件

用户模型:
class User extends Model
{
/**

  • 用户特长
    */
    public function userSpec(){
    return $this->hasMany(UserSpecialty::class, 'uid', 'id');
    }
    }
    特长模型
    class UserSpecialty extends Model
    {
    public function belongsToUser()
    {
    return $this->belongsTo(User::class, 'uid', 'id
    ');

    }

    public function cate()
    {
    return $this->has(Category::class, 'specialtyid', 'id');
    }
    }

现在我要找一个特长里面包括 php字符的用户
$oModel = new User();
$aList = $oModel->with("userSpec")->where($aFindArr)->limit(10)->get();
这里的where要怎么写?
如果UserSpecialty再有一个表和他一对一,比如
class SpecialtyCategory extends Model
{
public function belongsToUserSpecialty()
{
return $this->belongsTo(UserSpecialty::class, 'specialtyid', 'id');
}
}
这里
$aList = $oModel->whereHas("userSpec",
function($query) use ($search){
//TODO 这里应该怎么写
$query->where(['cate' => function ($catQuery) use ($search){
$catQuery->where('name','like','%',$search . '%')
->where('en_name','like', '%' . $search . '%');
}]);
}
)->limit(10)->get();

本作品采用《CC 协议》,转载必须注明作者和本文链接
lwj1435
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 5

$oModel->userSpec->where($aFindArr)->limit(10)->get();

5年前 评论

文档里复制粘贴的

$users = App\User::with(['posts' => function ($query) {
        $query->where('title', 'like', '%first%');
}])->get();

with可以写闭包的,
按照你的需求 要找一个特长里面包括 php字符的用户
只有with还不够,还需要has的,也是文档复制粘贴

// 获取所有至少有一条评论的文章且评论内容以 foo 开头
$posts = App\Post::whereHas('comments', function ($query) {
    $query->where('content', 'like', 'foo%');
})->get();

既然你会用with了,以上代码应该看得懂

5年前 评论
lwj1435

那么如果 再join多一个表呢?
比如说:在content 里面再join一个content的作者的表,作者的名字是 like foo%的
$posts = App\Post::whereHas('comments', function ($query) {
$query->where('content', 'like', 'foo%');
})->get();
应该是这样:
$posts = App\Post::whereHas('comments', function ($query) {
$query->whereHas('catrgory',, function ($auQuery) {
$auQuery->where('author','like','foo%');
});
})->get();
作者是一对一的,这里这样写不对

5年前 评论
lwj1435

如果是:文章里面有一个作者,作者和文章是一对一的关系,然后要作者是like 这个字符串呢?这里的where要怎么写?

5年前 评论

@lwj1435 首先文章和作者应该是一对多的关系,作者hasMany文章, 文章belongs作者。
然后还是没看懂你要实现啥,要是想再关联一张表,
我还是给你搬运文档吧。。。

预加载多个关联

有时,你需要在一次操作中预加载几个不同的关联。为了实现这个功能,只需在 with 方法上传递额外的参数即可:

$books = App\Book::with(['author', 'publisher'])->get();
嵌套预加载

预加载嵌套关联,可以使用「点」语法。例如,在一个 Eloquent 语句中,预加载所有书籍作者和这些作者的联系信息:

$books = App\Book::with('author.contacts')->get();

以上

然后 文档链接:模型关联《Laravel 5.5 中文文档》

5.5文档关键字是 “预加载”

5.7文档把“预加载”改成“渴求式加载”了,都差不多,用法也没变,意思也没变。

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
程序员 @ zoeker
文章
1
粉丝
0
喜欢
0
收藏
0
排名:1081
访问:4598
私信
所有博文
博客标签
社区赞助商