thinkphp中join的使用

两表的关联查询弄了很久,不想用tp很麻烦的关联模型,然后就看到了table和join,然后发现table不符合使用的要求。但是使用join出现了一堆的麻烦,先是表找不到(因为表没写完整,需要将整个表完整的写出来),再就是

方法三:表格方法

SQLSTATE[42000]463.com,: Syntax error or access violation: 1066 Not unique table/alias:

原因是因为连接出错:表的主键要找准,$Model->join(‘work ON artist.id =
work.artist_id’)->wehre(“artist.card_id 》10”)->select();
 写的位置要对准。

具体原因还待后期增加。


//Right Join
$Model->table(‘user U’)
->join(array(‘right’,’news N on U.id=N.cid’))
->field(‘U.*,N.*’)
->order(‘id desc’)
->limit(‘8’)
->findall();

如果join方法的参数用数组的话,只能使用一次join方法,并且不能和字符串方式混合使用。

$Model->table(‘think_blog blog,think_type
type’)->where(‘blog.typeid=type.id’)
->field(‘blog.id as id,blog.title,blog.content,type.typename as
type’)
->order(‘blog.id desc’ )->limit(5)->select();
Table方法的参数支持字符串和数组,数组方式的用法:
$Model->Table(array(‘think_user’=>’user’,’think_group’=>’group’))
->where(‘status>1’)
->select(); 
使用数组方式定义的优势是可以避免因为表名和关键字冲突而出错的情况。。
注:如果不定义table方法,默认会自动获取当前模型对应或者定义的数据表。

$Model->join(array(‘ work ON artist.id = work.artist_id’,’card ON
artist.card_id = card.id’))
->select()


查询Join支持,Join方法的参数支持字符串和数组,并且join方法是连贯操作中唯一可以多次调用的方法。例如:
$Model->join(‘work ON artist.id = work.artist_id’)
->join(‘card ON artist.card_id = card.id’)
->select();

先在Model创建视图模型类BlogViewModel.class.php文件的部分代码:
class BlogViewModel extends ViewModel {
    public $viewFields = array(
       
‘Blog’=>array(‘id’,’name’,’title’,’keywords’,’description’,’cTime’,’categoryId’,’content’,’readCount’,’tags’,’commentCount’,’status’),
        ‘Category’ => array(‘title’=>’category’,
‘_on’=>’Blog.categoryId=Category.id’)
    );
}
代码说明:
$viewFields:就是视图表的关联二维数组,每个数组说明结合的一个表;
‘Category’  =>  array(‘title’=>’category’,
‘_on’=>’Blog.categoryId=Category.id’),
这段代码中的’_on’就是表连接查询类似where条件,’title’=>’category’意思是在查询的结果以category访问对应的文章类别
title就是Category表要显示的字段,category是title字段显示的名称。等同于
title as category
在Action里面使用
$Blog = D(“BlogView”);     //调用视图模型类
$result = $Blog->where(‘Blog.id=’.$id)->find();

//Left Join
$Model->table(‘user U’)
->join(‘news N on U.id=N.cid’)
->field(‘U.*,N.*’)
->order(‘id desc’)
->limit(‘8’)
->findall();

相关文章