Я пытаюсь написать код, который отображает данные из базы данных в Laravel. Но у меня есть два значения таблицы, связанные друг с другом с помощью внешнего ключа, и когда я пытаюсь показать это на своей странице, он просто показывает идентификатор, а не фактическое имя. В другом вопросе stackoverflow я увидел, что вы должны определить значения данных таблицы в вашей модели, но это не работает или я сделал это неправильно. Может ли кто-нибудь быть так любезен, чтобы помочь мне исправить это, пожалуйста? :)

Модель Planet.php:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Planet extends Model
{
    public function solar()
    {
    return $this->belongsTo(SolarSystems::class, 'id');
    }
}

Модель SolarSystems.php:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class SolarSystems extends Model
{
    public function planet()
    {
        return $this->belongsTo(Planet::class, 'solar_systems_id');
    }
}

PlanetController.php:

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Planet;
use App\Models\SolarSystems;

class PlanetController extends Controller
{
    public function index()
    {
        $planets = Planet::all();
        $solar = SolarSystems::all();

        return view('welcome', ['planets'=>$planets]);
    }
    public function show($planeet)
    {
        $planets = Planet::all();
        $solar = SolarSystems::all();
    
        $planets = collect($planets)->where('name', $planeet);
        return view('welcome', ['planets' => $planets]);
    }
}

Welcome.blade.php :

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Laravel</title>
        <link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&display=swap" rel="stylesheet">
        <style>
            body {
                font-family: 'Nunito', sans-serif;
            }
        </style>
    </head>
    <body>

@foreach ($planets as $planeten)
    <ul>
        <li>{{ ucfirst($planeten->name) }}</li>
        <p>{{ ucfirst($planeten->description) }}</p>
        <p>{{ ucfirst($planeten->solar_systems_id) }}
    </ul>
@endforeach
    </body>
</html>

Import.sql:

CREATE DATABASE laravel;
USE laravel;
CREATE TABLE planets (
    id int(11) AUTO_INCREMENT,
    name text,
    description text,
    size_in_km int(11),
    solar_systems_id int(11),
    PRIMARY KEY (id)
);

CREATE TABLE solar_systems (
    id int(11) AUTO_INCREMENT,
    name text,
    age_in_years int(11),
    PRIMARY KEY (id)
);

INSERT INTO planets (name, description, size_in_km, solar_systems_id)
VALUES ('mars', 'Mars is the fourth planet from the Sun and the second-smallest planet in the Solar System, being larger than only Mercury.', 3389, 1);

INSERT INTO planets (name, description, size_in_km, solar_systems_id)
VALUES ('venus', 'Venus is the second planet from the Sun. It is named after the Roman goddess of love and beauty.', 6051, 1);

INSERT INTO planets (name, description, size_in_km, solar_systems_id)
VALUES ('earth', 'Our home planet is the third planet from the Sun, and the only place we know of so far thats inhabited by living things.', 6371, 1);

INSERT INTO solar_systems (name, age_in_years)
VALUES ('The Milky Way', 1360000000);

Это то, что я получаю прямо сейчас, но вместо «1» нужно сказать: «Млечный Путь». введите здесь описание изображения

3
Mauro 26 Янв 2022 в 14:28
Где реляционная таблица двух таблиц? Вы определили ту, которая соединяет две таблицы «планеты» и «солнечные_системы»? Имейте в виду, что вам нужен определенный ключ, который находится в обеих таблицах, например, идентификатор solar_system. Если вы не установили это, я думаю, вам следует сначала проверить, как настроить реляционную таблицу, а затем настроить свою модель.
 – 
Oris Sin
26 Янв 2022 в 14:40

2 ответа

Заменить эту строку

<p>{{ ucfirst($planeten->solar_systems_id) }} 

С этой линией

<p>{{ ucfirst($planeten->solar()->name) }}</p> 
0
Yazan Fouad Aldbaisy 26 Янв 2022 в 15:43
Поэтому используйте Planet::with('solar')->get() вместо Planet::all() , и скобки не нужны, просто <p>{{ ucfirst($planeten->solar->name) }}</p>
 – 
Yazan Fouad Aldbaisy
26 Янв 2022 в 15:55

Просто замени эту строку

{{ ucfirst($planeten->solar_systems_id) }} 

with this line 

{{ ucfirst($planeten->solar->name) }}

Потому что вам нужно получить имя из отношений

0
Wael Khalifa 26 Янв 2022 в 15:50
1
Как и в другом ответе, это вызывает проблему N+1, которую можно легко решить с помощью нетерпеливая загрузка $planets = Planet::with('solar')->get();
 – 
Clément Baconnier
26 Янв 2022 в 15:53