Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Есть таблица юзеров
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name',20);
$table->integer('image_id')->unsigned()->nullable();
$table->foreign('image_id')
->references('id')->on('file')
->onUpdate('cascade')->onDelete('cascade');
});
И изображений
Schema::create('file', function (Blueprint $table) {
$table->increments('id');
$table->string('link', 255);
});
"link" содержит в себе записи вида "kartinka.jpg".
Хочу вывести таблицу вида пользователь-картинка
Модель пользователя
protected $fillable = [
'name', 'image_id'
];
Модель файла(картинки)
public function User()
{
return $this->hasMany(User::class);
}
Метод
$users = User::orderBy('id','DESC')->paginate(5);
return view('admin.users.index',compact('users'))
->with('i', ($request->input('page', 1) - 1) * 5);
Вид
@foreach ($users as $user)
<tr>
<td>{{ ++$i }}</td>
<td>{{ $user->name }}</td>
<td>{{ //вывести картинку// }}</td>
</tr>
@endforeach
Как дописать метод для вывода изображений? Нужен ли foreach? И нужно ли в модели User прописать отношение к модели File, или хватает того, что есть в модели File?
Не в сети
При такой структуре у каждого юзера будет только одно изображение, причем твоей БД пользователь принадлежит изображению (немного странное решение). Добавь отношение в модели User:
public function file()
{
return $this->belongsTo(File::class);
}
Пользователей загружаешь сразу с изображениями:
User::with('file')
->latest()
->paginate(5);
Выводишь так:
<td>{{ $user->file->link }}</td>
Изменено AlexeyMezenin (22.04.2017 19:49:04)
Не в сети
При такой структуре у каждого юзера будет только одно изображение, причем твоей БД пользователь принадлежит изображению (немного странное решение). Добавь отношение в модели User:
public function file() { return $this->belongsTo('File::class'); }
Пользователей загружаешь сразу с изображениями:
User::with('file') ->latest() ->paginate(5);
Выводишь так:
<td>{{ $user->file->link }}</td>
Trying to get property of non-object
При том, что var_dump ($users) выводит массив с нужными данными
Изменено Tarasovych (22.04.2017 19:07:45)
Не в сети
Покажи что выдает dd($users)
Не в сети
Покажи что выдает dd($users)
LengthAwarePaginator {#272 ▼
#total: 2
#lastPage: 1
#items: Collection {#273 ▼
#items: array:2 [▼
0 => User {#270 ▶}
1 => User {#271 ▶}
]
}
#perPage: 5
#currentPage: 1
#path: "http://site/admin/users"
#query: []
#fragment: null
#pageName: "page"
}
апд:
массив пользователя
...
0 => User {#270 ▼
#fillable: array:9 [▶]
#hidden: array:2 [▶]
#connection: null
#table: null
#primaryKey: "id"
#keyType: "int"
#perPage: 15
+incrementing: true
+timestamps: true
#attributes: array:14 [▶]
#original: array:14 [▶]
#relations: array:1 [▶]
#visible: []
#appends: []
#guarded: array:1 [▶]
#dates: []
#dateFormat: null
#casts: []
#touches: []
#observables: []
#with: []
#morphClass: null
+exists: true
+wasRecentlyCreated: false
}
Изменено Tarasovych (22.04.2017 19:29:12)
Не в сети
AlexeyMezenin пишет:Покажи что выдает dd($users)
LengthAwarePaginator {#272 ▼ #total: 2 #lastPage: 1 #items: Collection {#273 ▼ #items: array:2 [▼ 0 => User {#270 ▶} 1 => User {#271 ▶} ] } #perPage: 5 #currentPage: 1 #path: "http://site/admin/users" #query: [] #fragment: null #pageName: "page" }
апд:
массив пользователя... 0 => User {#270 ▼ #fillable: array:9 [▶] #hidden: array:2 [▶] #connection: null #table: null #primaryKey: "id" #keyType: "int" #perPage: 15 +incrementing: true +timestamps: true #attributes: array:14 [▶] #original: array:14 [▶] #relations: array:1 [▶] #visible: [] #appends: [] #guarded: array:1 [▶] #dates: [] #dateFormat: null #casts: [] #touches: [] #observables: [] #with: [] #morphClass: null +exists: true +wasRecentlyCreated: false }
В
#attributes
есть нужный
image_id
Не в сети
Интересно посмотреть как раз relations, там должен быть объект file
Не в сети
Интересно посмотреть как раз relations, там должен быть объект file
"file" => null
Ага..
Не в сети
Если не у всех пользователей есть изображение, то добавь проверку:
<td>{{ is_null($user->file) ? 'no image' : $user->file->link }}</td>
Или то же самое, но с помощью @if
Не в сети
Если не у всех пользователей есть изображение, то добавь проверку:
<td>{{ is_null($user->file) ? 'no image' : $user->file->link }}</td>
Или то же самое, но с помощью @if
Ну у меня чистая БД, я создал 2 пользователя, судя по БД, изображение у них есть, оно есть так же в файлах проекта. Возможно, проблема в контроллере. Название изображения, идентичное файлу на сервере хранится в поле "link" в таблице "file"
Изменено Tarasovych (22.04.2017 19:47:45)
Не в сети
А, у тебя ключ не соответствует отношению, поэтому нужно его вручную добавить:
public function file()
{
return $this->belongsTo(File::class, 'image_id');
}
Еще кавычки убрать нужно в File:class. Или использовать 'App\File' вместо File:class
Если таблица называется file, а не files, то нужно еще добавить в модель File:
protected $table = 'file'
Но вообще, намного лучше следовать договоренностям, в таком случае кода будет в разы меньше. В этом вся прелесть Laravel.
Изменено AlexeyMezenin (22.04.2017 19:51:41)
Не в сети
А, у тебя ключ не соответствует отношению, поэтому нужно его вручную добавить:
public function file() { return $this->belongsTo(File::class, 'image_id'); }
Спасибо! Работает! Сейчас выводит просто название файла.
Сделал вот так:
<td>{{ Html::image('images/' . $user->file->link) }}</td>
Не в сети
Но вообще, намного лучше следовать договоренностям, в таком случае кода будет в разы меньше. В этом вся прелесть Laravel.
Не нашел в документации.. Можно ссылку?
Не в сети
Тут одной ссылкой не отделаешься, нужно прочитать всю документацию. Договоренности есть везде - в моделях, маршрутах, контроллерах и пр. Начни с чтения доков об Eloquent и отношениях:
https://laravel.ru/docs/v5/eloquent
https://laravel.ru/docs/v5/eloquent-relationships
Не в сети
Тут одной ссылкой не отделаешься, нужно прочитать всю документацию. Договоренности есть везде - в моделях, маршрутах, контроллерах и пр. Начни с чтения доков об Eloquent и отношениях:
https://laravel.ru/docs/v5/eloquent
https://laravel.ru/docs/v5/eloquent-relationships
Еще вопрос вдогонку: вышеприведенным способом можно (и нужно?) выводить, к примеру, авторов статьи (на такой же странице, где статей много, и возле каждой нужно указать автора) и т. д.?
Не в сети
Еще вопрос вдогонку: вышеприведенным способом можно (и нужно?) выводить, к примеру, авторов статьи (на такой же странице, где статей много, и возле каждой нужно указать автора) и т. д.?
Да, также выводишь. Сначала "жадно загружаешь" отношения, потом также выводишь. Если связь не belongsTo(), т.е., например, нужно вывести все книги одного автора, тогда нужно перечислять при выводе:
@foreach ($users as $user)
Author: {{ $user->name }}
@foreach ($user->books as $book)
{{ $book->title }}
@endforeach
@endforeach
Не в сети
Страницы 1