Yii2~SQL JOIN 2表

时间:2017-09-13 14:32:27

标签: php mysql yii2 yii2-basic-app

我对YII2很新,所以我真的不知道它是如何工作的,但我想在factuur_id上加入表格,以便我可以在发票中显示产品(factuur)

通常你会做这样的事情:

$connection = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
            if (mysqli_connect_errno()){
                die("Database Connection Failed: " . mysqli_error() . "(". mysqli_connect_errno() . ")"
               );
            }

            $sql = "SELECT * FROM facturen JOIN producten ON facturen.factuur_id = producten.factuur_id WHERE facturen.factuur_id = 13";

            if ($result =  mysqli_query($connection, $sql)){

                while ($row = mysqli_fetch_array($result, MYSQLI_BOTH)) {
                    echo $result;

但在yii2中你有类似查询构建器(?)的东西 那怎么办?

我想通过ID

显示正确发票的产品(producten)

my relations

2 个答案:

答案 0 :(得分:0)

使用数据库不是一个易于解释的功能。我建议你阅读有关它的指南:http://www.yiiframework.com/doc-2.0/guide-README.html#working-with-databases。但这里有一些快速信息。

简而言之,您应该尝试创建ActiveRecord对象。这可以通过启用" gii"您的配置中的模块,然后转到http://[your_host]/gii/model以生成表的活动记录类。

然后你可以为你的要求做这样的事情。

class Companies extends \yii\db\ActiveRecord {} // auto-generated
class Facturen extends \yii\db\ActiveRecord {} // auto-generated

function tryJoin()
{
    $cTableName = Companies::tableName();
    $fTableName = Facturen::tableName();

    $query = Companies->find();
    $query->leftJoin($fTableName, "{$cTableName}.company_id = {$fTableName}.company_id");
    $query->where([{$fTableName}.person_id => 123456]);
    $companyList = $query->all();
    // the result is a list of Company objects
}

或者,如果您不想创建ActiveRecord实体,可以通过DB命令快速进行。

$sql = "SELECT * 
        FROM companies
        LEFT JOIN facturen ON companies.company_id = facturen.company_id
        WHERE facturen.person_id = 123456;";
$command = Yii::$app->db->createCommand($sql, $params);
$arrayList = $command->queryAll();
// The result is a list of array mapping company table column names.

答案 1 :(得分:0)

如果您已生成具有db关系的模型,那么您可以执行以下操作:

[假设您的模型中有一个名为producten的关系Facturen.php]

/**
 * @return \yii\db\ActiveQuery
 */
public function getProducten()
{
    return $this->hasOne(Producten::className(), ['factuur_id' => 'factuur_id']);
}


在您的控制器中

$data = Facturen::find()
        ->joinWith('producten')
        ->where([Facturen::tableName().'.factuur_id' => '13'])
        ->one();


然后您可以按以下方式访问对象:

$data->company_id; // from table facturen

$data->producten['product_name'];
// from table producten because related tables are returned as arrays