Начнем с самого простого, установка и создание базы из 2 таблиц, про установку пропела я писать не буду, так как это достаточно неплохо описано в документации
Итак шаг первый, создание таблиц.
##Элоквоент
Делаем 3 миграции
./artisan make:migration create_posts
./artisan make:migration create_comments
./artisan make:migration create_comments_foreign_key
И наполняем их
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->text('content');
});
}
public function up()
{
Schema::create('comments', function (Blueprint $table) {
$table->increments('id');
$table->text('text');
$table->unsignedInteger('post_id');
});
}
public function up()
{
Schema::table('comments', function ($table) {
$table->foreign('post_id')->references('id')->on('posts');
});
}
(даунгрейд миграции приводить не буду)
Ну и делаем 2 файла моделей
./artisan make:model Post
./artisan make:model Comment
После чего прописываем в них связи
public function comments()
{
return $this->hasMany(Comment::class);
}
public function post()
{
return $this->belongsTo(Post::class);
}
Готово, можно начинать работать. Пришла очередь пропела.
##Пропел
Сгенерим пустую схемку
./artisan propel:schema:create
Теперь изменим ее под наши нужны, в итоге у меня она получилось вот такой, она полностью совместима с тем что генерирует ларавель в приведеных выше миграциях
<?xml version="1.0" encoding="UTF-8"?>
<database name="default" defaultIdMethod="native" namespace="App\Models">
<table name="posts" phpName="Post">
<column name="id" type="integer" sqlType="int(10) unsigned" required="true" primaryKey="true" autoIncrement="true"/>
<column name="content" type="longvarchar" required="true"/>
</table>
<table name="comments" phpName="Comment">
<column name="id" type="integer" sqlType="int(10) unsigned" required="true" primaryKey="true" autoIncrement="true"/>
<column name="text" type="longvarchar" required="true" />
<column name="post_id" type="integer" sqlType="int(10) unsigned" required="true"/>
<foreign-key foreignTable="posts" name="comments_post_id_foreign">
<reference local="post_id" foreign="id"/>
</foreign-key>
<index name="comments_post_id_foreign">
<index-column name="post_id" />
</index>
</table>
</database>
Но если нам не нужна такая строгости, то мы можем сделать схему легче и понятней
<?xml version="1.0" encoding="UTF-8"?>
<database name="default" defaultIdMethod="native" namespace="App\Models">
<table name="post">
<column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
<column name="content" type="longvarchar" required="true"/>
</table>
<table name="comment">
<column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
<column name="text" type="longvarchar" required="true" />
<column name="post_id" type="integer" required="true"/>
<foreign-key foreignTable="posts">
<reference local="post_id" foreign="id"/>
</foreign-key>
</table>
</database>
В таком случае ключи будут созданы сами с сгенерироваными именами.
После создания схемы вызываем
./artisan propel:migration:diff
./artisan propel:migration:up
./artisan propel:model:build
И все, модели готовы к использованию, ничего создавать и прописывать больше не нужно.
##Итог
Как по мне, так установка и первоначальная настройка пропела даже для 2 таблиц оказывается более легкой и быстрой чем использование элоквоена втроеного в ларавель, что немного странно.