Я довольно новичок в OctoberCMS / Lavarel ORM и я как бы застрял в реализации моделей отношений. У меня есть две таблицы базы данных / модели, где одна представляет общую информацию о программах A, B, C
и вторая общая информация о различных уровнях, связанных с этими программами.
Задача : Я хотел бы получить информацию для определенной программы X
+ получить всю информацию для уровней программы, связанных с ним.
Модель 1 — Схема таблицы
Schema::create('pgs_programs', function($table)
{
$table->engine = 'InnoDB';
$table->increments('id');
$table->char('prog_code', 10); // Unique ID/SKU
$table->string("prog_slug" )->nullable();
$table->string("prog_title")->nullable();
$table->text("prog_intro_title")->nullable();
$table->text("prog_intro")->nullable();
$table->text("prog_top_img" )->nullable();
$table->timestamps();
});
Модель 2 — Схема таблицы
Schema::create('pgs_program_levels', function($table)
{
$table->engine = 'InnoDB';
$table->increments('id');
$table->char('prog_code', 10); // Related to Parent Program ID/SKU
$table->string('level_title')->nullable();
$table->enum('prog_level', array(4,5,6,7))->nullable();
$table->text('prog_duration')->nullable();
$table->text("prog_desc")->nullable();
$table->text("prog_assesments" )->nullable();
$table->timestamps();
});
namespace PGS\Program\Components;
use Cms\Classes\ComponentBase;
use PGS\Program\Models\Program; // Model 1
use PGS\Program\Models\ProgramLevels; // Model 2
public function onRun(){
$Programmes = Program::all();
$X = $this->param('programme');
$Y = $this->param('disciplines');
$slug = $X."/".$Y ;
$arr = array();
foreach($Programmes as $k){
$arr[]= $k['prog_slug'];
}
if(in_array($slug, $arr) ){
// here query both models
// this query gets General info from table1
$progInfo = Program::where('prog_slug', '=', $slug)->first();
} else {
return $this->controller->run('404');
}
}
Я хотел бы понять / использовать array Relations
поэтому я могу сделать следующее в одном запросе. Я знаю, что могу сделать несколько запросов:
Запрос 1:
$progInfo = Program::where('prog_slug', '=', $slug)->first();
тогда запрос 2:
$progLvlsInfo = ProgramLevels::where('prog_code', '=', $progInfo['prog_code'])->get();
// returns array of all program levels
Я наткнулся на этот пост на ТАК это относится к этой же проблеме. Я пытался добавить $belongTo
в модели программы и наоборот, но не имели успеха ..
public $belongsTo = [
'program' => ['PGS\Program\Models\ProgramLevels',
'foreignKey' => 'prog_code']
];
Должен ли я придерживаться двух запросов, как указано выше, или использовать операторы Join, или использовать отношения, представленные в модели …
public $hasOne = [];
public $hasMany = [];
public $belongsTo = [];
public $belongsToMany = [];
public $morphTo = [];
public $morphOne = [];
public $morphMany = [];
public $attachOne = [];
public $attachMany = [];
Большое спасибо!
Определить класс UserAccount
Определить класс игры
У учетной записи пользователя может быть более 1 игры.
//UserAccount
function games() {
return $this->hasMany('Games', 'user_id');
}
UserAccount::find(1)->games();
Ссылка:
Других решений пока нет …