Your first query would actually have to be written like this:
$contact = Contact::where('user_id', Auth::user()->id)->where('id', $id)->first();
To solve your problem, you can use query scopes, like this:
class Contact extends Eloquent {
public function scopeGetById($query, $id)
{
return $query->where('user_id', Auth::user()->id)->where('id', $id);
}
}
You can then use it like this:
$contact = Contact::getById($id)->first();
Laravel 4.2 also introduced global scopes in case you always need to check for the currently logged in user. This feature is still undocumented, but you can have a look at the soft deleting trait and the corresponding scope to see how it's done.
another possibility
<?php
abstract class AbstractModel extends \Illuminate\Database\Eloquent\Model
{
public function newQuery()
{
$builder = $this->newEloquentBuilder(
$this->newBaseQueryBuilder()
);
$builder->setModel($this)->with($this->with);
if ($user = \Illuminate\Support\Facades\Auth::user()) {
$builder->where('user_id', '=', $user->id);
}
return $this->applyGlobalScopes($builder);
}
}
and then use it as
<?php
class MyModel extends AbstractModel {}
shabushabu said:
Your first query would actually have to be written like this:
$contact = Contact::where('user_id', Auth::user()->id)->where('id', $id)->first();
This is because $contact = Contact::where('user_id', Auth::user()->id)->find($id); will search in ALL contacts, not only in the contacts you filtered with user_id.
Its the same as $contact = Contact::where('user_id', Auth::user()->id)->first()->first(); This will return the first contact from DB, ignoring the where part and the 1st first().
Have been thinking about it, and still find this a very weird logic. Is it just me, or others also have this feeling?
I have asked it before, but only received an advantage of it. Link
Sign in to participate in this thread!
The Laravel portal for problem solving, knowledge sharing and community building.