2

我是 Zendframework 2 的新手。我正在尝试加入两个表并显示结果。

两张表是。作品和艺术家。这些表是根据艺术家 ID 连接的。

第 1 步> 在模型第 2 步中创建 2 个类(作品、艺术家)> 在 WorksTable 我有以下代码

class WorksTable extends AbstractTableGateway
{
     protected $table ='works';

    public function __construct(Adapter $adapter)
        {

        $this->adapter = $adapter;
        $this->resultSetPrototype = new HydratingResultSet(
                new ArraySerializableHydrator(),
                new Works()
        );
        $this->resultSetPrototype->buffer(); 
        $this->initialize();
    }

    public function fetchAll()
    {
        $select = $this->getSql()->select();
        $select->join('works','artists.artist_id = artist_id ');


        //create paginator object to display records
        $paginator =  new Paginator(
                new DbSelect($select, $this->adapter, $this->resultSetPrototype)
        );

        return $paginator;

    }

}

STEP 3> 在控制器中,我定义了以下代码

public function searchAction()
    { 
        $request = $this->getRequest();
        $paginator = $this->getWorksTable()->fetchAll();
 //         $paginator->setItemCountPerPage(12);
        $vm = new ViewModel(array(
                'poster' => $paginator,
        ));
        $vm->setVariable('paginator', $paginator);
        return $vm;   
    }

对于语句 $paginator->setItemCountPerPage(12); 得到错误

信息:

SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: 'works'

有没有人遇到过这个错误?关于如何解决这个问题的任何想法?

4

2 回答 2

0

您将works表连接到自身,mysql 将其视为连接但具有相同名称的两个单独的表,因此出现错误。

为您加入的表使用别名:

$select = $this->getSql()->select();
$select->join(array('w' => 'works'),'artists.artist_id = artist_id '); 

但看起来那里只是错字,表格应该是artists

于 2012-11-04T01:44:33.533 回答
0

没有使用artists表开始查询。也没有works在连接时使用表。

 use Zend\Paginator\Adapter\DbSelect;
 use Zend\Db\Sql\Sql;
 public function fetchAll()
 {
    $sql = new Sql($this->tableGateway->getAdapter());
    $select = new Select();
    $select->from("artists");
    $select->columns(array('*'));
    $select->join('works','artists.artist_id = works.artist_id',array('your_wanted_column_names,don't mention again artist_id here because there should be a error'));

    $paginator =  new Paginator(
            new DbSelect($select, $this->adapter, $this->resultSetPrototype)
    );

    return $paginator;
于 2015-05-13T04:53:13.117 回答