Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Тоже занимался когда-то подобным, но не ларавеле и сделал для себя вывод, что лучшим решением было разделение сервера чата и php фреймворка. Просто шарьте сессию через Redis (обязательно с id пользователя) и используйте данные сессии для полноценного чата на ноде. Желательно даже сообщения в отдельную бд писать, но не обязательно. Доступ к бд ларавеля у вас тоже есть со стороны ноды. Нужны какие-то данные? Просто обратитесь к базе и получите их.
По итогу у вас есть Laravel, который отдает фронтенд, который в свою очередь обращается к ноде и дальше работает непосредственно ТОЛЬКО с ней. Однако, нужно быть очень внимательным с окончанием сессий (по времени или вручную).
А если есть какие-либо изменения в Laravel, то через Redis можно отправить тоже событие, которое подхватит нода и дальше по сокетам разошлет.
1. Есть
$table->bigInteger('article_id')->unsigned();
2. В схеме есть. В модели оно автоматически с помощью модуля Dimsav\Translatable\Translatable; создано.
$table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade');
3. А вы видите в таблице хоть какие-то поля кроме id? Они перечислены в fillable, чтобы их можно было задавать, но модуль все это дело перемещает в соответствующие переводы. Смотрите на схему таблиц и вы поймете о чем я.
4. А его и нет. Опять же, столбец `locale` в самой таблице есть, остальное на плечах модуля. Он единственный популярный, который я нашел для Laravel.
$table->string('locale')->index();
И по сабжу, с проблемой я в итоге разобрался, надо было делать как-то так:
Article::with('translations.user')->paginate(10)
А потом для каждого отдельного обращаться к юзеру вот так:
$someArticle->translate()->user
Собственно, есть модель новостей `Article`, у неё есть таблица переводов, в которой по сути вся информация находится (`user_id`, `slug`, `title`, `description`, `body` и даты).
Как получить список новостей с привязкой к языку и с автором новости.
Вот так выглядят миграции и модели:
Schema::create('articles', function (Blueprint $table) {
$table->bigIncrements('id');
});
Schema::create('article_translations', function (Blueprint $table) {
$table->bigIncrements('id');
$table->bigInteger('article_id')->unsigned();
$table->integer('user_id')->unsigned();
$table->string('slug')->unique();
$table->text('title');
$table->text('description');
$table->text('body');
$table->string('locale')->index();
$table->timestamps();
$table->softDeletes();
$table->unique(['article_id','locale']);
$table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade');
$table->foreign('user_id')->references('id')->on('users')->onDelete('restrict');
});
DB::statement('ALTER TABLE article_translations ADD FULLTEXT full(title, description, body)');
// app\Article.php
<?php
namespace App;
use Dimsav\Translatable\Translatable;
use Illuminate\Database\Eloquent\Model;
class Article extends Model {
use Translatable;
public $timestamps = false;
public $translatedAttributes = [
'user_id',
'title',
'slug',
'description',
'body',
'created_at',
'updated_at',
'deleted_at'
];
protected $fillable = ['user_id', 'title', 'slug', 'description', 'body'];
}
// app\ArticleTranslation.php
<?php
namespace App;
use App\User;
use Cviebrock\EloquentSluggable\Sluggable;
use Illuminate\Database\Eloquent\Model;
class ArticleTranslation extends Model {
use Sluggable;
use FullTextSearch;
protected $fillable = ['title', 'slug', 'description', 'body'];
protected $searchable = ['title', 'description', 'body'];
/**
* Return the sluggable configuration array for this model.
*
* @return array
*/
public function sluggable() {
return [
'slug' => [
'source' => 'title',
'maxLength' => 255
]
];
}
public function user() {
return $this->belongsTo(User::class, 'user_id');
}
}
Здесь находится приложение полностью.