Rajcsányi Zoltán, on 06 April 2012 - 11:22 AM, said:
Az, hogy fizikai adatbázis kapcsolat nincsen talán nem akkora probléma, mivel lehet scope-okat készíteni, ha megfelelő idegen kulcsok vannak, márpedig itt igen, akkor a yii-ben logikailag felépítehted a kapcsolat rendszert. (azt, hogy hogyan én sem tudom, meg azt sem, hogy miért nem jó)
http://www.yiiframew...th-named-scopes
Kicsit kezdem úgy érezni ezt a problémát, hogy tulajdonképpen nem teljesen megfelelő az adatbázis szervezése.
Miért nem készítesz egy olyan táblát, amiben a keresési kritériumoknak megfelelően redundánsan feltöltöd értékekkel, és akkor csak abban a táblában kell keresned.
Egyrészt nyersz azzal, hogy az AR ott már hatékony lesz. Félő, hogy olyan terhelést fogsz így adni a szervernek, hogy ha még működni is fog a rendszered, egy nagyobb adatbázisnál és felhasználó tábornál már nagyon erős szerver kell hozzá.
Érdekel és várom a megoldást.
Az a baj, hogy elég sok féle adat van és kategória, kategóiránként más más értékekkel mezőkkel. Így ez bizonyult a leghatékonyabbnak. Jobb megoldást nem találok rá (egyelőre). Csak ez a járható út.
Közben meglett a megoldás, de az + feltételekre nem akar keresni, az alap az megy, de a többi még nem.
Model része:
public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
Yii::app()->getModule('User');
Yii::app()->getModule('Profile');
return array(
'hid' => array(self::HAS_ONE, 'HirdetesExtra', 'hirdetes_id'),
'kid' => array(self::HAS_ONE, 'Kategoriak', 'id'),
'kategoria' => array(self::HAS_ONE, 'Kategoriak', 'id'),
'pid' => array(self::HAS_ONE, 'User', 'id'),
'uid' => array(self::HAS_ONE, 'Profile', 'user_id')
);
}
private $_criteria;
private $_hirdetesExtraCriteria;
private $_hirdetesKatCriteria;
private $_hirdetesUserCriteria;
public function actionSearch() {
$model = new Hirdetes();
$modelextra = new HirdetesExtra();
$modeluser = new Profile();
$modelkat = new Kategoriak();
$model->unsetAttributes(); // clear any default values
$modelextra->unsetAttributes(); // clear any default values
$modeluser->unsetAttributes(); // clear any default values
$modelkat->unsetAttributes(); // clear any default values
if(isset($_POST['HirdetesExtra'])) {
$this->_hirdetesExtraCriteria = new CDbCriteria();
foreach ($_POST['HirdetesExtra'] as $hirdetesextra=>$value) {
if($value == 1) $value1 = 'egyfele'; $value2='masikfele';
if(!empty($value)) $this->_hirdetesExtraCriteria->addColumnCondition(array($hirdetesextra => $value1, $hirdetesextra=>$value2), 'AND', 'OR');
}
}
if(isset($_POST['Profile'])) {
$this->_hirdetesUserCriteria = new CDbCriteria();
foreach ($_POST['Profile'] as $hirdetesuser=>$value) {
if(!empty($value)) $this->_hirdetesUserCriteria->addColumnCondition(array($hirdetesuser => $value));
}
}
if(isset($_POST['Kategoriak'])) {
$this->_hirdetesKatCriteria = new CDbCriteria();
foreach ($_POST['Kategoriak'] as $hirdeteskat=>$value) {
if(!empty($value)) $this->_hirdetesKatCriteria->addColumnCondition(array($hirdeteskat => $value));
}
}
if(isset($_POST['Hirdetes'])) {
$this->_criteria = new CDbCriteria();
foreach ($_POST['Hirdetes'] as $hirdetes=>$value) {
if(!empty($value)) $this->_criteria->addColumnCondition(array($hirdetes =>$value));
}
/*
if ($this->_hirdetesExtraCriteria) {
$this->_criteria->mergeWith(array(
'with' => array(
'hid' => array(
'select' => false,
'joinType' => 'INNER JOIN',
),
),
));
$this->_criteria->mergeWith($this->_hirdetesExtraCriteria);
}
if ($this->_hirdetesUserCriteria) {
$this->_criteria->mergeWith(array(
'with' => array(
'uid' => array(
'select' => false,
'joinType' => 'INNER JOIN',
),
),
));
$this->_criteria->mergeWith($this->_hirdetesUserCriteria);
}
if ($this->_hirdetesKatCriteria) {
$this->_criteria->mergeWith(array(
'with' => array(
'kid' => array(
'select' => false,
'joinType' => 'INNER JOIN',
),
),
));
$this->_criteria->mergeWith($this->_hirdetesKatCriteria);
}*/
}
if($this->_criteria) {
$criteria = new CActiveDataProvider('Hirdetes', array('criteria' => $this->_criteria));
//var_dump($this->_criteria); exit;
//var_dump($criteria); exit;
$this->render('talalat',array(
'model'=>$criteria
));
} else {
$this->render('search',array(
'model'=>$model,
'modelextra'=>$modelextra,
'modeluser'=>$modeluser,
'modelkat'=>$modelkat
));
}
}