mysql - Laravel 5.4 原始连接查询

标签 mysql laravel join left-join

我有一个用于存储博客文章的表TBL_POST。一个帖子可以分配给多个类别,有一列 cat_id 以逗号分隔的模式存储类别 ID,如 2,4,6。我想在这一行中使用FIND_IN_SET()方法

->leftJoin(TBL_CAT.' as c', 'p.cat_id', '=', 'c.id')

显示关联的类别名称。我该怎么做?

public static function getPostWithJoin($status="")
{
    $query = DB::table(TBL_POST .' as p')
            ->select('p.id','p.post_title','p.post_status','u.name as author','c.name as cat_name','p.updated_at')
            ->leftJoin(TBL_ADMINS.' as u', 'p.post_author', '=', 'u.id')
            ->leftJoin(TBL_CAT.' as c', 'p.cat_id', '=', 'c.id')
            ->where('p.post_type','post');
    if($status!="all") {
        $query->where('p.post_status',$status); 
    }

    $query->orderby('p.id','DESC');
    $data = $query->paginate(20);

    return $data;       
}

最佳答案

您可以使用回调来创建更复杂的连接查询。

->leftJoin(TBL_CAT, function($query){
     $query->on(TBL_CAT.'id', '=', 'p.cat_id')->where("**", "**", "**");
})

这是 laravel 文档上的链接 - https://laravel.com/docs/5.4/queries#joins “高级连接子句”部分。

更新:: 如评论中所述,为此类数据设置字符串并不是一个好主意。因为相等搜索应该比字符串检查简单得多。即使您的数据量应该没有太大差异,您也永远不知道您的应用程序将来会发生什么。

但如果你仍然想这样做,我认为你可以这样尝试

->leftJoin(TBL_CAT, function($query){
     $query->where(DB::raw("FIND_IN_SET(".TBL_CAT.".id, p.cat_id)"), "<>", "0");
})

加入将检查 cat_id 中是否存在 id。

关于mysql - Laravel 5.4 原始连接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45262030/

相关文章:

perl - DBIx::Class - 使用预取获取用作条件的所有关系?

php - 如何将从单个表单中获取的用户数据保存到一个 MySQL 数据库中的多个表中?

mysql - MySQL十六进制文字二进制

laravel - 对整数调用成员函数 addEagerConstraints()

php - 使用带流明的望远镜

php - Laravel 5.1 中未定义的默认命名空间

python - 如何防止 django admin 模型中出现重复条目

MySQL:获取匹配多个 WHERE 条件的多键行(可能很简单)

sql - 使用 Join 进行更新并选择最新值

php - Zend_Db_选择 : Working with JOIN's