Проблема с вставкой из ввода в базу данных - PullRequest
1 голос
/ 07 мая 2020

У меня много отношений между моделью UserProfile и моделью UserTv. Вот таблицы.

user_profiles

id    user_id    username
 1       1       AuthUser

tv

id    name
 1    Action
 2    Drama
 3    Comedy
 4    manually added some genre from input from authenticated user

user_tv

id    user_id    tv_id
 1      1          2
 1      1          4

Например, эти первые три идентификатора в tv table (Action, Drama, Comedy) вставляются через сеялки, и этот четвертый идентификатор вставляется вручную через вводимый текст из формы тем пользователем, который прошел проверку подлинности. И в этом моя проблема. Я хочу, чтобы те значения, которые добавляются вручную через ввод в форму, могли видеть только того пользователя, который вставил эти значения, а все остальные пользователи не могли. Но также я хочу, чтобы все пользователи остались, чтобы видеть те первые три значения, которые генерируются с помощью сидера. На данный момент все работает так, что все пользователи могут все видеть. Любая помощь приветствуется. Вот мой код.

UserProfile. php

<?php

namespace App;

use App\User;
use Illuminate\Support\Facades\App;
use Illuminate\Database\Eloquent\Model;

class UserProfile extends Model
{
    protected $fillable = [
        'user_id',
        'username',
    ];

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function tvs()
    {
        return $this->belongsToMany(UserTv::class, 'user_tv', 'user_id', 'tv_id');
    }
}

UserTv. php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class UserTv extends Model
{
    protected $table = 'tv';

    protected $fillable = [
        'name'
    ];

    public function userProfiles()
    {
        return $this->belongsToMany(UserProfile::class, 'user_tv', 'tv_id', 'user_id');
    }
}

web. php

Route::get('profile/{profile}', 'UserProfileController@showProfile')->name('profile.show');
Route::patch('profile/update-tv-options', 'TvController@updateTvOptions')->name('profile.update.tv.options');
Route::post('profile/insert-tv-options', 'TvController@insertTvOptions')->name('profile.insert.tv.options');

TvController. php

<?php

namespace App\Http\Controllers;

use App\UserTv;
use App\UserProfile;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
use App\Http\Requests\InsertTvOptionsRequest;
use App\Http\Requests\UpdateTvOptionsRequest;

class TvController extends Controller
{
    public function updateTvOptions(UpdateTvOptionsRequest $request)
    {
        $user = Auth::user();

        $userProfile = UserProfile::where('user_id', Auth::id())->first();
        $userProfile->update($request->all());

        $data = $request->get('tvsOptions', '[]');
        $userProfile->tvs()->sync($data);

        return redirect()->route('profile.show', [$user->username]);
    }

    public function insertTvOptions(InsertTvOptionsRequest $request)
    {
        $user = Auth::user();

        $tv = UserTv::create($request->all());

        return redirect()->route('profile.show', [$user->username]);
    }
}

UserProfileController. php

<?php
namespace App\Http\Controllers;

use App\User;
use App\UserTv;
use App\UserProfile;

class UserProfileController extends Controller
{
    public function showProfile($username, Request $request)
    {
        $profileId = User::getIdFromUsername($username);
        $userForShowProfile = User::with('userProfile')->where('id', $profileId)->firstOrFail();

        $tvsOptions = UserTv::get();

        $userTvsOptions = UserProfile::findOrFail($profileId)->tvs()->get();

        return view('profile.show', compact('userForShowProfile', 'tvsOptions', 'userTvsOptions'));
    }
}

show.blade. php

<section data-edit="movies" class="editMovies">
    <h3 class="textBold">Film</h3>
    <form action="{{ route('profile.update.tv.options') }}" method="POST" class="flex">
        @method('PATCH')
        @csrf
        <div class="form-group flex">
            @isset($tvsOptions, $userTvsOptions)
                @foreach($tvsOptions as $option)
                    <div class="interestedIn">
                        <input type="checkbox" name="tvsOptions[]" value="{{ $option->id }}" {{ $userTvsOptions->contains('id', $option->id)? 'checked': ''}}>
                        <label for="">{{ $option->name }}</label>
                    </div>
                @endforeach
            @endisset
        </div>
        <div class="form-group">
            <label for="" class="textBold">Button FOR CHECKBOX</label>
            <input type="submit" class="form-control" name="submit" value="BUTTON">
        </div>
    </form>
    <form action="{{ route('profile.insert.tv.options') }}" method="POST" class="flex">
        @csrf
        <div class="form-group mt-5">
            <input type="text" name="name" placeholder="INSERT NEW MOVIE GENRE">
        </div>
        <div class="form-group">
            <label for="" class="textBold">Button FOR INSERT!!!</label>
            <input type="submit" class="form-control" name="submit" value="BUTTON">
        </div>
    </form>
</section>

Ответы [ 2 ]

1 голос
/ 07 мая 2020

И я хочу, чтобы первые три варианта были для всех пользователей, а четвертый вариант - только для того пользователя, который их вставил.

Что-то вроде этого?

$defaultTvsOptions = UserTv::whereIn('name', ['Action', 'Drama', 'Comedy'])->get(); // return only action, drama and comedy. you can use ids.
$userTvsOptions = UserProfile::findOrFail($profileId)->tvs;

$tvsOptions = $defaultTvsOptions->merge($userTvsOptions); // merge default and logged user tvs options

Чтобы сделать его более удобным в обслуживании, вы можете использовать configs в своем root каталоге проекта.

$defaultTvsOptions = UserTv::whereIn('name', config('config name where return the array'));

Надеюсь, это тебе поможет.

0 голосов
/ 07 мая 2020

Привет, у вас есть сводная таблица. Вы можете получить данные вот так:

Модель профиля пользователя

public function tv() {
       return $this->hasManyThrough(
           'Tv class ',
           'user_tv class', 
           'user_id',
           'id',
           'user_id',
           'tv_id'
       );
   }

UserController

$data = UserProfile::with('tv')
            ->where(condition)        
                ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...