New yo Yii : Problem with relations and Mysql

Hello everybody,

I am new with Yii, and like everybody i’m trying to do my 1st application with Yii.

Atm, my only problem, is that relation beetween table are never detected when i use Yiic or Gii.

Here’s is my tables structures, what’s wrong with it ?




SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;

SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;

SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';


DROP SCHEMA IF EXISTS `reloaded` ;

CREATE SCHEMA IF NOT EXISTS `reloaded` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;

USE `reloaded` ;


-- -----------------------------------------------------

-- Table `reloaded`.`cleValidation`

-- -----------------------------------------------------

DROP TABLE IF EXISTS `reloaded`.`cleValidation` ;


CREATE  TABLE IF NOT EXISTS `reloaded`.`cleValidation` (

  `id` BIGINT UNSIGNED NOT NULL ,

  `valeur` VARCHAR(45) NOT NULL ,

  `dateGeneration` DATETIME NOT NULL ,

  PRIMARY KEY (`id`) )

ENGINE = MyISAM;


CREATE UNIQUE INDEX `idUsers_UNIQUE` ON `reloaded`.`cleValidation` (`id` ASC) ;


CREATE UNIQUE INDEX `valeurCleValidation_UNIQUE` ON `reloaded`.`cleValidation` (`valeur` ASC) ;




-- -----------------------------------------------------

-- Table `reloaded`.`Users`

-- -----------------------------------------------------

DROP TABLE IF EXISTS `reloaded`.`Users` ;


CREATE  TABLE IF NOT EXISTS `reloaded`.`Users` (

  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT ,

  `username` VARCHAR(45) NOT NULL ,

  `login` VARCHAR(45) NOT NULL ,

  `password` VARCHAR(128) NOT NULL ,

  `typeCompte` ENUM('natif','facebook','openid','twitter') NOT NULL ,

  `naissance` DATE NULL ,

  `compteValide` TINYINT(1)  NULL DEFAULT 0 ,

  `salt` VARCHAR(128) NULL ,

  PRIMARY KEY (`id`) ,

  CONSTRAINT `fk_Users_cleValidation`

    FOREIGN KEY (`id` )

    REFERENCES `reloaded`.`cleValidation` (`id` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION)

ENGINE = MyISAM;


CREATE UNIQUE INDEX `idUsers_UNIQUE` ON `reloaded`.`Users` (`id` ASC) ;


CREATE UNIQUE INDEX `usernameUsers_UNIQUE` ON `reloaded`.`Users` (`username` ASC) ;


CREATE UNIQUE INDEX `loginUsers_UNIQUE` ON `reloaded`.`Users` (`login` ASC) ;


CREATE INDEX `fk_Users_cleValidation` ON `reloaded`.`Users` (`id` ASC) ;




-- -----------------------------------------------------

-- Table `reloaded`.`categories`

-- -----------------------------------------------------

DROP TABLE IF EXISTS `reloaded`.`categories` ;


CREATE  TABLE IF NOT EXISTS `reloaded`.`categories` (

  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,

  `nom` VARCHAR(45) NULL ,

  PRIMARY KEY (`id`) )

ENGINE = MyISAM;


CREATE UNIQUE INDEX `idcategories_UNIQUE` ON `reloaded`.`categories` (`id` ASC) ;


CREATE UNIQUE INDEX `nomCategories_UNIQUE` ON `reloaded`.`categories` (`nom` ASC) ;




-- -----------------------------------------------------

-- Table `reloaded`.`sousCategories`

-- -----------------------------------------------------

DROP TABLE IF EXISTS `reloaded`.`sousCategories` ;


CREATE  TABLE IF NOT EXISTS `reloaded`.`sousCategories` (

  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,

  `nom` VARCHAR(45) NOT NULL ,

  `idParent` INT UNSIGNED NOT NULL ,

  PRIMARY KEY (`id`) ,

  CONSTRAINT `fk_sousCategories_categories1`

    FOREIGN KEY (`idParent` )

    REFERENCES `reloaded`.`categories` (`id` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION)

ENGINE = MyISAM;


CREATE UNIQUE INDEX `idSousCategories_UNIQUE` ON `reloaded`.`sousCategories` (`id` ASC) ;


CREATE UNIQUE INDEX `nomSousCategories_UNIQUE` ON `reloaded`.`sousCategories` (`nom` ASC) ;


CREATE INDEX `fk_sousCategories_categories1` ON `reloaded`.`sousCategories` (`idParent` ASC) ;




-- -----------------------------------------------------

-- Table `reloaded`.`Articles`

-- -----------------------------------------------------

DROP TABLE IF EXISTS `reloaded`.`Articles` ;


CREATE  TABLE IF NOT EXISTS `reloaded`.`Articles` (

  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,

  `titre` VARCHAR(255) NOT NULL ,

  `auteur` BIGINT UNSIGNED NOT NULL ,

  `texte` TEXT NOT NULL ,

  `date` DATETIME NOT NULL ,

  `categories` INT UNSIGNED NOT NULL ,

  `sousCategories` INT UNSIGNED NULL ,

  `featured` TINYINT(1)  NULL DEFAULT 0 ,

  PRIMARY KEY (`id`) ,

  CONSTRAINT `fk_Articles_Users1`

    FOREIGN KEY (`auteur` )

    REFERENCES `reloaded`.`Users` (`id` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION,

  CONSTRAINT `fk_Articles_categories1`

    FOREIGN KEY (`categories` )

    REFERENCES `reloaded`.`categories` (`id` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION,

  CONSTRAINT `fk_Articles_sousCategories1`

    FOREIGN KEY (`sousCategories` )

    REFERENCES `reloaded`.`sousCategories` (`id` )

    ON DELETE NO ACTION

    ON UPDATE NO ACTION)

ENGINE = MyISAM;


CREATE UNIQUE INDEX `idArticles_UNIQUE` ON `reloaded`.`Articles` (`id` ASC) ;


CREATE INDEX `fk_Articles_Users1` ON `reloaded`.`Articles` (`auteur` ASC) ;


CREATE INDEX `fk_Articles_categories1` ON `reloaded`.`Articles` (`categories` ASC) ;


CREATE INDEX `fk_Articles_sousCategories1` ON `reloaded`.`Articles` (`sousCategories` ASC) ;




-- -----------------------------------------------------

-- Table `reloaded`.`Breves`

-- -----------------------------------------------------

DROP TABLE IF EXISTS `reloaded`.`Breves` ;


CREATE  TABLE IF NOT EXISTS `reloaded`.`Breves` (

  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,

  `titre` VARCHAR(255) NOT NULL ,

  `auteur` BIGINT UNSIGNED NOT NULL ,

  `texte` TEXT NOT NULL ,

  `date` DATETIME NOT NULL ,

  `categories` INT UNSIGNED NULL ,

  `sousCategories` INT UNSIGNED NULL ,

  PRIMARY KEY (`id`) )

ENGINE = MyISAM;


CREATE UNIQUE INDEX `idArticles_UNIQUE` ON `reloaded`.`Breves` (`id` ASC) ;





SET SQL_MODE=@OLD_SQL_MODE;

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;

SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;






Thanks for your help !

MyISAM doesn’t support foreign keys. You could use InnoDB as engine in MySQL.

Thanks Mike for your answer, i tried to switch in InnoDB but no change (it don’t even regenerate a model)

Its works now … I don’t really understand why … Btw thanks :)

Just for personal curiosity, what the best way to use value from another table ? Use relation, or make it hardcoded (since i don’t really need innodb functionality)

Your generated AR relation() code should work with MyISAM too. No constraint checking will take place, though.

/Tommy