Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Собственно, есть модель новостей `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');
}
}
Здесь находится приложение полностью.
Не в сети
Не очень понятен вопрос.
1) В таблице ArticleTranslation есть article_id?
2) В модели не вижу связи ArticleTranslation и Article
3) Может имеет смысл убрать из таблицы Article поля, которые есть в ArticleTranslation: title, body ? И хранить все тексты в одном месте.
4) Не вижу столбца lang в ArticleTranslation
Не в сети
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
Не в сети
Не понял, что используется модуль.
Не в сети
Страницы 1