@extends('layouts.appinterno')
@section('content')
<div class='row'>
{{ csrf_field() }}
<input type="hidden" id="hdnCurtiu" value="{{ $curtiu }}">
<div class="col-md-12 col-sm-12">
<section class="row">
@foreach($vitrinesX->chunk(3) as $row)
@foreach($row as $vitrine)
<div class="col-sm-12 col-md-4">
<div class="box-noticias">
<a href="javascript:void(0);" onclick='xxx.vitrine.abrirVitrine({{$vitrine->id}});' >
{{$vitrine->titulo}}
</a>
</div>
<p id="like" class="likes" onclick="xxx.vitrine.salvarEscolha({{ $vitrine->id }}, 1)">
<i class="fa fa-thumbs-up"></i> <span id="qtdeCurtiu_{{ $vitrine->id }}">{{ $vitrine->qtdeCurtiu }}</span>
</p>
</div>
@endforeach
@endforeach
</section>
</div>
</div>
@endsection
@section('scripts')
<script src="{{ asset('js/xxx/xxx.Formatadores.js').'?v='xxx(uniqid()) }}" ></script>
<script src="{{ asset('js/xxx/xxx.Vitrine.js').'?v='xxx(uniqid()) }}" ></script>
<script>
$(document).ready(function() {
if($('#hdnCurtiu').val() == "1")
$('#like').addClass('like');
else if($('#hdnCurtiu').val() == "0")
$('#dislike').addClass('like');
})
</script>
@endsection
Vitrine.prototype.abrirVitrine = function(id) {
$.ajax({
url: "/vitrine/" + id + "/obter",
method: "GET",
error: function() {
xxx.openModalCustom(
"Erro",
"Erro ao obter a notícia.",
"Entendi",
"error"
);
},
success: function(data) {
datacriacao = xxx.formatadores.DataBDParaDataBrasil(
data.retorno.created_at
);
titulo = data.retorno.titulo;
subtitulo = data.retorno.subtitulo;
conteudo = data.retorno.conteudo;
url = data.retorno.url;
$("#datacriacao").html(datacriacao);
$("#titulo").html(titulo);
$("#subtitulo").html(subtitulo);
$("#conteudo").html(conteudo);
$("#image").attr("src", url);
$("html, body").animate(
{ scrollTop: $("#datacriacao").offset().top },
1000
);
}
});
};
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Carbon\Carbon;
use Debugbar;
use DB;
class UserVitrine extends Model
{
public function obter($user_id, $vitrine_id){
return UserVitrine
::where('user_id', \DB::raw($user_id))
->where('vitrine_id', \DB::raw($vitrine_id))
->first();
}
public function obterCurtidasPorVitrine($vitrine_id, $curtiu){
return UserVitrine
::where('vitrine_id', \DB::raw($vitrine_id))
->where('curtiu', \DB::raw($curtiu))
->count();
}
}
// Previous data (last question)
$vitrinesX = Vitrine
::vigente()
->ativa()
->aprovada()
->global(Auth::user()->tipoparticipante_id)
->orderBy('id','desc')
->withCount([
'user_vitrines as qtdeCurtiu' => function (Builder $query) { $query->where('curtiu', 1); },
//'user_vitrines as dislikes' => function (Builder $query) { $query->where('curtiu', 0); }
])
->get();
// The new Collection to be send to the view: Needed columns vitrine_id and user_id
$data = Vitrine::with('user_vitrines')->get();
dd($data); // Difficult to obtain informations here
users
id
name
images
id
title
filename
image_user
id
user_id
image_id
vote
We set up the relationships at the Model level where we can tell Laravel to include the Vote data from the pivot table.class User {
public function images() {
return $this->belongsToMany(Image::class)->withPivot('vote');
}
}
class Image {
public function users() {
return $this->belongsToMany(User::class)->withPivot('vote');
}
}
This now means that for each User we can access the Images they've voted on - $user->images(); and for each Image, we can access the Users who have voted on it - $image->users();$images = Image::with('members')->get()
->each(function($image) {
$image->votedBy = $image->members->pluck('id');
});
What we're doing here is loading all images from the database, along with the related members. We're then looping over each image and setting a new property called votedBy. The value of this new property is a collection of Member IDs. Now for each image in our collection, we end up with something like this:@foreach ($images as $image)
@php $hasUserVoted = $image->votedBy->contains($userId); @endphp
<div>
<h2>{{ $image->title }}</h2>
<button {{ $hasUserVoted ? 'disabled' : '' }}>Like</button> <button {{ $hasUserVoted ? 'disabled' : '' }}>Dislike</button>
</div>
@endforeach
All we're doing here is checking whether the votedBy collection contains a given userId, and setting a variable to either true or false. We then use that variable to decide whether to echo 'disabled' into the button or not. public function vitrines() {
return $this->belongsToMany(Vitrines::class)->withPivot('user_vitrines');
}
//------------------------------
//Correspondent to your code
//-----------------------------
class User {
public function images() {
return $this->belongsToMany(Image::class)->withPivot('vote');
}
}
public function users() {
return $this->belongsToMany(User::class)->withPivot('user_vitrines');
}
//------------------------------
//Correspondent to your code
//-----------------------------
class Image {
public function users() {
return $this->belongsToMany(User::class)->withPivot('vote');
}
//--------------------
// Code last question
//--------------------
$vitrinesX = Vitrine
::vigente()
->ativa()
->aprovada()
->global([0])
->orderBy('id','desc')
->withCount([
'user_vitrines as qtdeCurtiu' => function (Builder $query) { $query->where('curtiu', 1); },
//'user_vitrines as dislikes' => function (Builder $query) { $query->where('curtiu', 0); }
])
->get();
//-------------
// Added now
//-------------
$images = Vitrine::with('users')->get()
->each(function($vitrine) {
$image->curtiu= $image->users->pluck('id');
});
//---------------------------------------
// Correspondent to your code
//---------------------------------------
$images = Image::with('members')->get()
->each(function($image) {
$image->votedBy = $image->members->pluck('id');
});
//-------------------------------------------------------------------------------
// This returns to Vitrine view
return view('vitrines.index',compact('vitrinesX', 'images', 'vitrine','qtdeCurtiu','qtdeNaoCurtiu','curtiu'));
//User Model
public function vitrines() {
return $this->belongsToMany(Vitrines::class)->withPivot('curtiu');
}
//Vitrine Model
public function users() {
return $this->belongsToMany(User::class)->withPivot('curtiu');
}
$images = Vitrine::with('users')->get()
->each(function($vitrine) {
$vitrine->curtiu = $vitrine->users->pluck('id');
});
$images = Vitrine::with('users')->get()
->each(function($vitrine) {
$vitrine->curtiu = $vitrine->users->pluck('id');
});
//Obtains data
dd($images)
$vitrinesX = Vitrine
::vigente()
->ativa()
->aprovada()
->global(Auth::user()->tipoparticipante_id)
->orderBy('id','desc')
->withCount([
'user_vitrines as qtdeCurtiu' => function (Builder $query) { $query->where('curtiu', 1); },
'user_vitrines as dislikes' => function (Builder $query) { $query->where('curtiu', 0); }
])
->get();
rename table user_vitrine to user_vitrines
public function vitrines() {
return $this->belongsToMany(Vitrines::class, 'user_vitrines')->withPivot('curtiu');
}
public function vitrines() {
return $this->belongsToMany(Vitrine::class)->withPivot('curtiu');
}
And on the Vitrine model, you define the inverse relationship like so:public function users() {
return $this->belongsToMany(User::class)->withPivot('curtiu');
}
$images = Vitrine::with('users')->get()
->each(function($vitrine) {
$vitrine->curtiu = $vitrine->users->pluck('id');
});
That will retrieve a list of Images ($images). Each Image will have a property called curtiu that contains a collection of UserId (Users that have liked an image).$images = Vitrine::with('users')
->withCount([
'users as likes' => function (Builder $query) { $query->where('curtiu', 1); },
'users as dislikes' => function (Builder $query) { $query->where('curtiu', 0); }
])
->get();
That will retrieve a list of Images ($images). Each image will have 2 new properties called likes and dislikes that contain the number of likes ('curtiu' = 1) and dislikes ('curtiu' = 1) from the pivot table. $images = Vitrine::with('users')
->withCount([
'users as likes' => function (Builder $query) { $query->where('curtiu', 1); },
'users as dislikes' => function (Builder $query) { $query->where('curtiu', 0); }
])
->get()
->each(function($vitrine) {
$vitrine->curtiu = $vitrine->users->pluck('id');
});
That will retreive a list of Images ($images). Each image will have 3 extra properties - likes (containing the number of likes), dislikes (containing the number of dislikes) and curtiu (containing a list of UserIds that have liked or disliked the image).
public function vitrines() {
return $this->belongsToMany(Vitrines::class)->withPivot('curtiu');
}
public function users() {
//return $this->belongsToMany(User::class)->withPivot('curtiu');
return $this->belongsToMany(User::class, 'user_vitrines')->withPivot('curtiu');
}
$vitrinesX = Vitrine
::vigente()
->ativa()
->aprovada()
->global(Auth::user()->tipoparticipante_id)
->orderBy('id','desc')
->withCount([
//--- changed to user_vitrine (from users_vitrine)
'user_vitrine as qtdeCurtiu' => function (Builder $query) { $query->where('curtiu', 1); },
//'user_vitrines as dislikes' => function (Builder $query) { $query->where('curtiu', 0); }
])
->get();
// EF 2020
$images = Vitrine::with('users')->get()
->each(function($vitrine) {
$vitrine->curtiu = $vitrine->users->pluck('id');
});
I thought your model was called Vitrine (no s).=> Yes
In your User model you have this:
//public function user_vitrines() {
// Used before at the last question... (and stays)
public function user_vitrine() {
return $this->hasMany('App\Models\UserVitrine');
}
public function users() {
//return $this->belongsToMany(User::class)->withPivot('curtiu');
return $this->belongsToMany(User::class, 'user_vitrines')->withPivot('curtiu');
}
<?php
namespace App;
use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use App\Notifications\RedefinirSenha;
class User extends Authenticatable
{
use HasApiTokens,Notifiable;
}
$mUserVitrine = new UserVitrine();
$qtdeCurtiu = 0;
$qtdeNaoCurtiu = 0;
$userVitrine = null;
if(!empty($vitrine)){
$qtdeCurtiu = $mUserVitrine->obterCurtidasPorVitrine($vitrine->id, 1);
$qtdeNaoCurtiu = $mUserVitrine->obterCurtidasPorVitrine($vitrine->id, 0);
$userVitrine = $mUserVitrine->obter(Auth::user()->id, $vitrine->id);
} else {
$qtdeCurtiu = $mUserVitrine->obterCurtidasPorVitrine($vitrinesX[0]->id, 1);
$qtdeNaoCurtiu = $mUserVitrine->obterCurtidasPorVitrine($vitrinesX[0]->id, 0);
$userVitrine = $mUserVitrine->obter(Auth::user()->id, $vitrinesX[0]->id);
}
$curtiu = !empty($userVitrine) ? $userVitrine->curtiu : "";
//return view('vitrines.index',compact('vitrinesX','vitrine','qtdeCurtiu','qtdeNaoCurtiu','curtiu'));
return view('vitrines.index',compact('vitrinesX', 'images', 'vitrine','qtdeCurtiu','qtdeNaoCurtiu','curtiu'));
}
public function salvarEscolha(Request $request){
$vitrine_id = $request->input('vitrine_id');
$curtiu = $request->input('curtiu');
info($vitrine_id);
info($curtiu);
$mUserVitrine = new UserVitrine();
$userVitrine = $mUserVitrine->obter(Auth::user()->id, $vitrine_id);
if(empty($userVitrine)){
$userVitrine = new UserVitrine();
$userVitrine->user_id = Auth::user()->id;
$userVitrine->vitrine_id = $vitrine_id;
$userVitrine->created_at = Carbon::now();
}
$userVitrine->curtiu = $curtiu;
$userVitrine->updated_at = Carbon::now();
$userVitrine->save();
return response()->json(new Resultado(true, 'Sucesso', null), 200);
}
// $mUserVitrine = new UserVitrine();
// $qtdeCurtiu = 0;
// $qtdeNaoCurtiu = 0;
//
// $userVitrine = null;
//
// if(!empty($vitrine)){
// $qtdeCurtiu = $mUserVitrine->obterCurtidasPorVitrine($vitrine->id, 1);
// $qtdeNaoCurtiu = $mUserVitrine->obterCurtidasPorVitrine($vitrine->id, 0);
//
// $userVitrine = $mUserVitrine->obter(Auth::user()->id, $vitrine->id);
// } else {
// $qtdeCurtiu = $mUserVitrine->obterCurtidasPorVitrine($vitrinesX[0]->id, 1);
// $qtdeNaoCurtiu = $mUserVitrine->obterCurtidasPorVitrine($vitrinesX[0]->id, 0);
//
// $userVitrine = $mUserVitrine->obter(Auth::user()->id, $vitrinesX[0]->id);
// }
// $curtiu = !empty($userVitrine) ? $userVitrine->curtiu : "";
// Just maintaining it for view's compatibility:
$curtiu = 0;
public function salvarEscolha(Request $request) {
$vitrine_id = $request->vitrine_id;
$curtiu = $request->curtiu;
info('xxx');
info($vitrine_id);
info($curtiu);
Auth::user()->vitrines()->sync(array($vitrine_id => array('curtiu' => $curtiu)), false);
return response()->json(new Resultado(true, 'Sucesso', null), 200);
}
public function vitrines() {
return $this->belongsToMany(Models\Vitrine::class)->withPivot('curtiu');
}
select * from user_vitrine order by id desc
I guess you want to disable the button not only the icon?
So you can add the disabled to the button
here is an example with the Bootstrap class
Open in new window
You will need some server side to apply the class based on your requirements and a way to remember the state.
You can save the state to DB (this will kept the value for that user even if he clear the browser cache)
or you can use localstorage or sessionstorage but the user can clear the cache and the saved value will be lost.
https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage
**Remember that this can be easily edited from browser console so you may want to have server side validation to make sure.