Relationships in laravel 5.4 - laravel

when the admin select a category in <select></select> i want to get its id for insert it in a question table
table questions:
Schema::create('questions', function (Blueprint $table) {
$table->increments('id');
$table->string('question_text');
$table->string('type');
$table->integer('points');
$table->integer('temps_reponse');
$table->integer('categories_id')->unsigned();
$table->foreign('categories_id')->references('id')->on('categories');
$table->timestamps();
});
table categorie :
Schema::create('categories', function (Blueprint $table) {
$table->increments('id');
$table->string('categorie');
$table->timestamps();
});
Question Model
class Question extends Model
{
public function categorie()
{
return $this->belongsTo(Categorie::class, 'categories_id');
}
}
Categorie Model
class Categorie extends Model
{
public function question()
{
return $this->hasMany(Question::class, 'question_id')->withTrashed();
}
}
I am blocked with it for a few hours please any help to solve it
my html
<label class="form-label">Choisir la categorie :</label>
<select class="" id="s2example-1" name="categorie">
<option></option>
#foreach ($categories as $categorie)
<option>{{ $categorie->categorie }}</option>
#endforeach
</select>

In order to send the id instead of the string back to the server, supply the value attribute on each option element: <option value={{$categorie->id}}>{{ $categorie->categorie }}</option>

Related

Order by activity date instead of users followed

I have two tables, the activities table and followings table. I want to get "following" activity the date it was created instead of by the date the user was created.
Schema::create('activities', function (Blueprint $table) {
$table->bigIncrements('id');
$table->integer('user_id')->index();
$table->integer('activity_id')->index();
$table->string('activity_type', 50);
$table->timestamps();
$table->index(['activity_id', 'activity_type']);
});
Schema::create('followings', function (Blueprint $table) {
$table->bigIncrements('id');
$table->integer('user_id');
$table->unsignedBigInteger('follower_id');
$table->dateTime('followed_date')->nullable();
$table->dateTime('unfollowed_date')->nullable();
$table->timestamps();
$table->unique(['user_id', 'follower_id']);
});
Right now I have this code:
Controller:
$followings = $user->following()->get();
View:
#foreach($followings->sortByDesc('id') as $following)
#foreach($following->user->activity->sortByDesc('id') as $activity)
#if($activity->activity_type == 'App\Thread')
<li class="activity">
<div class="activity-user">
<p class="avatar" style="background-color: {{ $activity->user->color }}">
{{ substr($activity->user->name, 0, 1) }}</p>
</div>
<div class="activity-body">
<h4>{{ $activity->user->name }}
published <a
href="/forums/{{ $activity->activity->channel->slug }}/{{ $activity->activity->slug }}/">
{{ $activity->activity->title }}</a></h4>
<p>
{!! BBCode::parse($activity->activity->body) !!}
</p>
<p class="created-at">
{{-- {{ $activity->activity->created_at->format('l') }}
at
{{ $activity->activity->created_at->format('h:i A') }} --}}
{{ $activity->activity->created_at->format('M j, Y') }}
</p>
</div>
</li>
#endif
#endforeach
#endforeach
Model:
public function following()
{
return $this->hasMany(Following::class);
}
Is there anyway for me to reach the polymorphic table and order by the Activity date instead of by the following() date?
Right now, it returns records based on the user's name in the date they posted it, but I would like it strictly by the activity.
For your scenario, you will be better of with a custom DB query like this, I haven't tested it so you will need to adjust for your use case but basic concept for Laravel is pretty much the same.
$following = Following::join('users', 'followings.user_id', '=','users.id')
->join('activites', 'users.id', '=', 'activities.user_id')
->orderBy('activities.created_at')
->select('followings.*')
->get();
Here's how I did it:
Controller
$followings = $user->following()->get();
foreach($followings as $following) {
foreach($following->user->activity as $activity) {
$followingArray[] = $activity->id;
}
}
//dd($followingArray);
if(!empty($followingArray)){
$following = Activity::whereIn('id', $followingArray)->orderBy('created_at', 'desc')->get();
} else {
$following = '';
}
View:
#if(!empty($following))
#foreach($following as $activity)

Laravel, changing form fields based on category selection

I have 2 categories in my db named 'House Rental' and 'Vehicle rental'
Users can post free ads based on the two categories.
My Listing model contains this:
Schema::create('listings', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('body');
$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('area_id');
$table->unsignedBigInteger('category_id');
$table->boolean('live')->default(false);
$table->softDeletes();
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('area_id')->references('id')->on('areas')->onDelete('cascade');
$table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
});
When a user visits add listing form, say he selects 'House Rentals' category, I want the add form to show fields like 'size', 'rooms', 'building_type', 'is_furnished', 'is_parking', etc.
At the same time if a user adds a listing and he selects 'Vehicle Rentals', I want the add form to show fields like 'vehicle_model', 'year_of_registration', 'condition', etc.
How would I go about doing this?
This is a single vue component that can be of assistance
<template>
<div>
<form #submit.prevent="iEdit ? iUpdate(): createMethod()">
<label> Select Rental </label>
<select class="form-control" #change="rentalChanged($event)" v-model="rentalForm.rental_category">
<option value="house rental"> House Rental </option>
<option value="vehicle rental"> Vehicle Rental </option>
</select>
<select v-if="house_rental">
<!-- show house rental options -->
</select>
<select v-if="vehicle_rental">
<!-- show vencle rental options -->
</select>
</form>
</div>
</template>
<script>
name: 'componentName',
data(){
return {
rentalForm: new Form({
rental_category: '',
another_form_field:'',
}),
iEdit : false,
vehicle_rental :false,
house_rental: false,
}
},
methods{
rentalChanged(event){
if(event.target.value == 'house rental'){
this.house_rental = true;
this.vehicle_rental = false;
}
if(event.target.value == 'vehicle rental'){
this.house_rental = false;
this.vehicle_rental = true;
}
},
iUpdate(){
//update method
},
createMethod(){
//create method
},
},
mounted(){
}
</script>
I hope it gives a clue I didn't test it.

how to add more than one value using sync () method in laravel 5.8

what i am trying sync more than one value in the same table so far what i have done is that i have created model of the user and university and define the realtion between them as many to many to many such as the user has many unviersties and universities has many user
in my user model i have defined the realtion such as the
public function University()
{
return $this->belongsToMany(University::class);
}
in my university model
public function user()
{
return $this->belongsToMany(User::class);
}
i have also created a seprate migration since it is the many to many relationship
by the name of university_user
public function up()
{
Schema::create('university_user', function (Blueprint $table) {
$table->bigIncrements('id');
$table->integer('user_id');
$table->integer('university_id');
$table->timestamps();
});
}
in my controller i am trying to update the profile of user such as
public function ProfileUpdate(Request $request ,User $user)
{
$up=User::find($user->id);
$up->experince=$request->input('experince');
$up->city_id=$request->input('city');
$up->status=$request->input('account-type-radio');
$up->gender=$request->input('gender');
$up->year1=$request->input('year1');
$up->year2=$request->input('year2');
$up->University()->sync($request->Uni1);
$up->University()->sync($request->Uni2);
$up->location()->sync($request->location);
$up->subject()->sync($request->subject);
$up->grade()->sync($request->grade);
$up->update();
return redirect(route('user.index'));
}
in the form
<div class="row">
<div class="col-xl-4">
<div class="submit-field">
<h5>Institute</h5>
<select name="Uni1" id="Uni1">
#foreach($uni as $university)
<option value="{{$university->id}}">
{{$university->name}}
</option>
#endforeach
</select>
</div>
</div>
<div class="row">
<div class="col-xl-4">
<div class="submit-field">
<h5>Institute</h5>
<select name="Uni2" id="Uni2">
#foreach($uni as $uni1)
<option value="{{$uni1->id}}">
{{$uni1->name}}
</option>
#endforeach
</select>
</div>
</div>
The problem is only one value is getting stored in university_user table not two.. please tell me what my mistake is i'll be thank ful to u regards my laravel version is 5.8..

Laravel 5.5 - Blade templates, querying deeper into a hasMany relationship

I am wondering if I can query a hasOne -> hasMany relationship in blade. I can currently get a count on how many models exist in my blade using "$participant->messages->count()" but I would like to check the model and count other things. For instance I would like to run the following query in blade:
{!! $participant->messages->where($this->messages->mediaURL, "=", null)->count() !!}
I get the following error:
Property [mediaURL] does not exist on this collection instance.
Here is my controller function
public function showParticipants()
{
$participants = Participant::all();
// $messages = $participants->participant_id->messages;
return view('home')->with(['participants'=> $participants, 'messages'=>'hi']);
}
Part of my Participant model:
public function messages()
{
return $this->hasMany('App\Message', 'message_id', 'participant_id');
}
Part of my Message model:
public function participant()
{
return $this->belongsTo(Participant::class);
}
My message table structure:
public function up()
{
Schema::create('messages', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->integer('message_id')->unsigned();
$table->string('message_content')->nullable();
$table->string('mediaSID')->index()->nullable();
$table->string('messageSID')->index()->nullable();
$table->string('mediaURL')->index()->nullable();
$table->binary('media')->nullable();
$table->string('filename')->index()->nullable();
$table->string('MIMEType')->nullable();
$table->timestamps();
});
Schema::table('messages', function($table) {
$table->foreign('message_id')->references('participant_id')->on('participants')->onDelete('cascade');
});
}
My Participant DB structure:
public function up()
{
Schema::create('participants', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->string('participant_id')->unique();
$table->dateTime('appointmentDate')->nullable();
$table->dateTimeTz('timezoneOffset')->nullable();
$table->dateTime('appointmentDate_twoWeeks')->nullable();
$table->dateTime('notificationTime')->nullable();
$table->integer('notificationTally')->nullable();
$table->boolean('studyCompleted')->default(0);
$table->boolean('subscribed');
$table->timestamps();
});
}
My blade just to give all info:
#isset($participants)
#foreach ($participants as $participant)
<tr>
<td>
{!! $participant->participant_id !!}
</td>
<td>
{!! $participant->subscribed !!}
</td>
<td>
{!! $participant->notificationTime !!}
</td>
<td>
{!! $participant->notificationTally !!}
</td>
<td>
{!! $participant->studyCompleted !!}
</td>
<td>
{!! $participant->messages->count() !!}
</td>
<td>
{!! $participant->messages->where($participant->messages->mediaURL, "=", null)->count() !!}
</td>
</tr>
#endforeach
#endisset
I believe the issue is $this->messages->mediaURL. With the Query Builder, if you're wanting to refer to a column on a table you would just need to pass it a string. Also when you're querying a relationship you should use the method and not the property e.g. $participant->messages(). Lastly, when querying for a null column you can use the whereNull method.
{!! $participant->messages()->whereNull('mediaURL')->count() !!}
You are using the "magic" __get() on messages that returns a collection because it is a has many relationship.
$participant->messages->where($this->messages->mediaURL, "=", null)->count()
should be
$participant->messages()->where($participant->messages()->first()->mediaURL, "=", null)->count()

Save one to many without creating

I just have a little problem. I have a one to many relationship. A team has many users. Many users have a team.
I have six teams of which the user has to choose one. How can I connect the team with the user without creating a new entry in the database 'team'?
User:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id')->unique();
$table->string('name');
$table->integer('team_id')->unsigned()->nullable();
$table->foreign('team_id')->references('id')->on('users')->onDelete('cascade');
$table->string('username')->nullable()->unique();
$table->string('email')->unique();
$table->string('phone')->nullable()->unique();
$table->string('avatar');
$table->string('slug');
$table->string('password');
$table->date('birthday');
$table->boolean('gender');
$table->rememberToken();
$table->timestamps();
});
}
Team:
public function up()
{
Schema::create('teams', function (Blueprint $table) {
$table->increments('id')->unique();
$table->string('name');
$table->string('image');
$table->string('image_thumbnail');
$table->timestamps();
});
}
Controller:
public function storeTeam($request)
{
$user = Auth::user();
$team = Team::findOrFail($request->team_id);
$user->team()->associate($team);
return redirect()->back()->with('success', lang::get('messages.team'));
}
View:
<div class="col-md-12">
<form method="POST" action="{{ URL::route('store.team') }}">
{{ csrf_field() }}
<ul class="row clients-dotted list-inline text-center">
#foreach ($teams as $team)
<li class="col-md-4 col-sm-3 col-6">
<div class="cc-selector">
<input id="team{{$team->id}}" type="radio" name="team" value="{{$team->id}}" />
<label style="background-image:url({{ $team->image_thumbnail }});" class="team-cc" for="team{{$team->id}}"></label>
<p>{{$team->name}}</p>
</div>
</li>
#endforeach
</ul>
<button type="submit" class="mb-50 float-right mr-20 btn btn-shadow-1 btn-primary">weiter</button>
</form>
route:
Route::post('/welcome/team', 'ProfilesController#storeTeam')->name('store.team');
i have a little problem with this and get the error:
Type error:
Type error: Too few arguments to function App\Http\Controllers\ProfilesController::storeTeam(), 0 passed and exactly 1 expected
Assuming that you're storing the team_id on the user model, you can use the associate method to set the primary key on the child -- user in this case
$user->team()->associate($team);
You would pass the selected team to the controller. Doesn't matter how. You can pass it as part of a route, or you can pass the team ID from a form and get it from the request.
You're expecting a variable to literally be passed to the controller called $request. What you want is to inject $request as a dependency. You can do that by typehinting the resolved variable like so:
public function storeTeam(Request $request)
Mind you, you'll need to have use Illuminate\Http\Request; at the top of your file, otherwise you will get errors regarding the Request class.

Resources