#php #laravel #laravel-5 #eloquent
#php #laravel #laravel-5 #красноречивый
Вопрос:
У меня есть таблица статей, определяемых их ID
, name
price
и category_ID
, и таблица категорий, определяемых category_ID
и name
. Я хочу выбрать в своем контроллере список статей вместе с категорией name
.
Как это сделать?
Комментарии:
1. вы используете Eloquent?
2. вы должны определить красноречивые взаимосвязи в своих моделях
Ответ №1:
Мой ответ предполагает, что вы храните модели в папке App Models
В вашей модели Articles определите следующий метод.
public function category()
{
return $this->belongsTo('AppModelsCategory');
}
Теперь вы можете получить к нему доступ через $myArticle->category->name;
Убедитесь, что в модели категорий определена правильная таблица, основываясь на вашем вопросе, я не могу составить таблицу категорий.
Поместите $table = 'categories';
в категорию model или как там называется таблица.
Комментарии:
1. Обратите внимание, что $myArticle->category() (вызывается как метод) возвращает объект построителя запросов, поэтому вы не можете получить доступ к свойству name. Вместо этого вы должны вызывать отношение как свойство и, чтобы избежать N 1 запросов, стремитесь загрузить отношение перед циклическим выполнением подробных статей.
2. Последнее замечание заключается в том, что вы могли бы обратиться к связанной модели с помощью
Category::class
. Пока модель категории (файл) находится в том же каталоге, что и модель Post, она будет преобразована в правильный класс, а также для ввода полного доменного имени в виде строки. Кроме того, вы также получите поддержку завершения / рефакторинга IDEs.
Ответ №2:
с помощью raw SQL
$query = "SELECT articles.* , categories.name AS categoryName FROM articles JOIN categories ON articles.category_ID = categories. category_ID"
$result = DB::select(SQL);
dump($result)
или
с помощью Eloquent
вы можете добавить в свою модель метод для возврата отношения, давайте назовем его category
class Article extends Model {
public function category(){
return $this->hasOne("App/Category" , "category_ID" , "category_ID");
}
}
теперь вы можете сделать это
$article = Article::find(1);
dump($article->category->name);
метод проверки hasOne
из документов